题目描述
给你一个日期,请你设计一个算法来判断它是对应一周中的哪一天。
输入为三个整数:day
、month
和 year
,分别表示日、月、年。
您返回的结果必须是这几个值中的一个 {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}
。
做题情况
- 做出来且思路与标答一致
- 做出来但思路较为复杂 ☑
- 有思路,但时间复杂度较高无法通过
- 没有思路
自己的想法:
自己的想法其实很简单,就是根据今天的时间去倒推。但显而易见的是,这样很麻烦,而且很容易出错,正巧答案有蛮多种方法的,我一看,哦原来都没怎么学过,因此就尝试一下好了,权当一种对于这些方法的记录。
标答:
方法一:调用API
这里就不展开说了,每种算法都有属于自己的API,直接调用就可以了。
方法二:模拟
这个也不展开说了,之前估计做过超级多次了,烦都烦死了。
方法三:基姆拉尔森公式
提供年月日,可以得到当天是星期几。
w = (d + 2m + 3(m + 1) / 5 + y + y / 4 - y / 100 + y / 400 + 1) % 7
其实用到的知识很简单,可以概括为同余。这个公式的推导由几部分组成。
1、求每年第一天的星期。
由于这个只看一年有多少天,因此我们只需要关注那一年是闰年就可以了。
2、求一年某一天的星期。
求这个值时需要借助本年第一天的星期。由于2月非闰年是28天,为7的倍数,因此我们只需要考虑每个月超出28的那些天数就可以了。
3、考虑完这两个因素之后,我们需要进行一些数学推导。因为1得到的是具体的y/4-y/100+y/400
,但2得到的是一个数组(因为每个月的天数不具有一定规律),因此我们还需要进行一定的数学推理,得到结果。
方法四:蔡勒公式
emmm,就不展开了。这个公式和基姆拉尔森公式相比,还有一定的适用范围限制。
实际代码
无,模拟的代码太繁琐,哥们就不写了。
总结
唔没有什么总结吧,写着一篇是为了总结一下知道某一天日期,求当天的星期,还蛮神奇的。