给你一个日期,请你设计一个算法来判断它是对应一周中的哪一天。
输入为三个整数:day、month 和 year,分别表示日、月、年。
您返回的结果必须是这几个值中的一个 {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}。
因为题目给出的日期是在 1971
到 2100
年之间的有效日期,所以可统计距离1971.1.1的总天数。已知1971.1.1是周五,区分闰年和闰月,得到总天数。对星期求余可得到周几,代码如下:
class Solution:
def dayOfTheWeek(self, day: int, month: int, year: int) -> str:
week = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]
total = 5 #因为1971.1.1是周五
for v in range(1971,year):#计算当前年之前的总天数
if (v % 4 == 0 and v % 100 != 0) or v % 400 == 0:
total += 366
else:
total += 365
if (year % 4 == 0 and year % 100 != 0) or year % 400 == 0:#区分闰二月
m = [31,29,31,30,31,30,31,31,30,31,30,31]
else:
m = [31,28,31,30,31,30,31,31,30,31,30,31]
for i in range(month-1):#计算当年月份的天数
total += m[i]
total += day#最后加上天数
return week[(total-1)%7]#减1是因为week的起始是周一
时间复杂度O(year-1971+month-1)(PS:不确定哈哈哈)今天眼睛磨得好痛,但担心拖延成习惯,要坚持,即使每天只做一道简单题。
题解中有使用蔡勒(Zeller)公式的,可以直接计算出周几。公式如下:
本题即如下公式:
附评论公式题解:
// 注意这里从周六开始
const DAYS: [&str; 7] = ["Saturday", "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday"];
impl Solution {
pub fn day_of_the_week(day: i32, month: i32, year: i32) -> String {
let m;
let y;
// 1月和2月是特殊情况,视为去年的13和14月
if month < 3 {
m = month + 12;
y = year - 1;
} else {
m = month;
y = year;
}
// 套公式,索然无味
let h = (day + 13 * (m + 1) / 5 + y + y / 4 - y / 100 + y / 400) % 7;
DAYS[h as usize].into()
}
}
作者:antena
链接:https://leetcode-cn.com/problems/day-of-the-week/solution/rustcai-le-gong-shi-by-antena-vxcp/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。