一周中的第几天

119 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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)