一周中的第几天(LeetCode日记)

LeetCode-1185-一周中的第几天

题目信息:

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

输入为三个整数:daymonthyear,分别表示日、月、年。

您返回的结果必须是这几个值中的一个 {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}

  • 示例1:

输入:day = 31, month = 8, year = 2019
输出:“Saturday”

  • 示例2:

输入:day = 18, month = 7, year = 1999
输出:“Sunday”

  • 示例3:

输入:day = 15, month = 8, year = 1993
输出:“Sunday”

提示:

  • 给出的日期一定是在 19712100 年之间的有效日期。

相关标签 :数学

题解

首先祝大家元旦节假期,玩的开心!
今天的问题属于简单难度,属于是大多数人的编程白月光了。虽然很简单,但是我还是觉得有必要出个题解给大家瞧瞧,毕竟还是有很多初入编程的朋友们的。

方法:模拟

题目规定输入的日期一定是在 1971 到 2100 年之间的有效日期,即在 1971 年 1 月 1 日,到 2100 年 12 月 31 日之间。通过查询日历可知,1970 年 12 月 31 日是星期四,我们只需要算出输入的日期距离 1970 年 12 月 31 日有几天,再加上 3 后对 7 求余,即可得到输入日期是一周中的第几天。

求输入的日期距离 1970 年 12 月 31 日的天数,可以分为三部分分别计算后求和:

  1. 输入年份之前的年份的天数贡献;
  2. 输入年份中,输入月份之前的月份的天数贡献;
  3. 输入月份中的天数贡献。

其中(1)和(2)部分的计算需要考虑到闰年的影响。当年份是 400 的倍数或者是 4 的倍数且不是 100 的倍数时,该年会在二月份多出一天。

实现代码(Python)
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]      # 根据总天数偏移计算实际偏移量

题记:


  • 研究生在读,我会尽量保持LeetCode每日一题的思路和代码输出。希望大家多多支持。
  • 水平有限,希望各位大佬能够批评指正。您的教诲是我进步的船帆。
  • 希望各位跟我一样的小白能跟我一起参与到做题和讨论中来。共同进步是我所能期盼的最高愿想。
  • 您的点赞和关注是我坚持分享的动力泉源,希望能将这件简单平凡的事一直做下去。感谢大家。

  • 9
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值