持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第6天,点击查看活动详情。
题目描述
给你一个日期,请你设计一个算法来判断它是对应一周中的哪一天。
输入为三个整数:day、month 和 year,分别表示日、月、年。
您返回的结果必须是这几个值中的一个 {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}。
来源:力扣(LeetCode)
- 示例1
输入: day = 31, month = 8, year = 2019
输出: "Saturday"
- 示例2
输入: day = 18, month = 7, year = 1999
输出: "Sunday"
- 示例3
输入: day = 15, month = 8, year = 1993
输出: "Sunday"
提示:
- 给出的日期一定是在
1971到2100年之间的有效日期。
思路分析
根据题目提示,我们可以知道有这样一个规定:给出的日期一定是在 1971 到 2100 年之间的有效日期;所以输入的具体日期一定是在1971年12月31日 到 2100年12月31日 之间,我们只需要计算出输入的日期距离1971年12月31日的天数即可;但这仅仅只是计算出天数而已,我们想要的结果是一个星期的第几天,所以得查询出1971年12月31日那天是周四;把我们计算出来的天数加3然后再对7求余,这样就可以得出我们输入的日期在一个星期中的第几天。
计算过程可以分成三步,1.根据输入的年份计算出这一年到1971年12月31日之间的天数;2.根据输入的月份计算出2100年1月1日到输入的月份之间的天数;3。输入天数加上前两步计算的天数就是输入的日期到1971年12月31日的总天数;4.也要考虑到闰年的影响,根据数学知识可知:当年份是 400 的倍数或者是 4 的倍数且不是 100 的倍数时,该年会在二月份多出一天;5.总天数加上3再对7求余就是某一周的第几天了。
AC代码
function solution(day, month, year) {
const weekStr = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"];
const monthDays = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30];
let days = 365 * (year - 1971) + Math.floor((year - 1969) / 4);
let i = month-2;
console.log(days)
while( i >= 0 ) {
debugger
days += monthDays[i];
--i
}
if ((year % 400 === 0 || (year % 4 === 0 && year % 100 !== 0)) && month >= 3) {
days += 1;
}
days += day;
console.log(weekStr[(days + 3) % 7])
return weekStr[(days + 3) % 7];
}
solution(30,5,2022)