给你一个日期,请你设计一个算法来判断它是对应一周中的哪一天。
输入为三个整数:day
、month
和 year
,分别表示日、月、年。
您返回的结果必须是这几个值中的一个 {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}
。
输入:day = 31, month = 8, year = 2019
输出:“Saturday”
输入:day = 18, month = 7, year = 1999
输出:“Sunday”
输入:day = 15, month = 8, year = 1993
输出:“Sunday”
1971
到 2100
年之间的有效日期。相关标签 :数学
首先祝大家元旦节假期,玩的开心!
今天的问题属于简单难度,属于是大多数人的编程白月光了。虽然很简单,但是我还是觉得有必要出个题解给大家瞧瞧,毕竟还是有很多初入编程的朋友们的。
题目规定输入的日期一定是在 1971 到 2100 年之间的有效日期,即在 1971 年 1 月 1 日,到 2100 年 12 月 31 日之间。通过查询日历可知,1970 年 12 月 31 日是星期四,我们只需要算出输入的日期距离 1970 年 12 月 31 日有几天,再加上 3 后对 7 求余,即可得到输入日期是一周中的第几天。
求输入的日期距离 1970 年 12 月 31 日的天数,可以分为三部分分别计算后求和:
其中(1)和(2)部分的计算需要考虑到闰年的影响。当年份是 400 的倍数或者是 4 的倍数且不是 100 的倍数时,该年会在二月份多出一天。
class Solution:
def dayOfTheWeek(self, day: int, month: int, year: int) -> str:
weekdayStr = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"] # 数字与天数字符串的映射
daysBeforeMonth = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334] # 每个月之前的总天数,如2月之前的总天数=daysBeforeMonth[1]
days = 365 * (year - 1971) + (year - 1969) // 4 + daysBeforeMonth[month - 1] + day # 计算总天数
if (year % 400 == 0 or year % 4 == 0 and year % 100 != 0) and month >= 3: days += 1 # 当前年是闰年且月份大于2,天数多加一天
return weekdayStr[(4 + days) % 7] # 根据总天数偏移计算实际偏移量