1185.一周中的第几天

给你一个日期,请你设计一个算法来判断它是对应一周中的哪一天。

输入为三个整数: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)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值