首页 > 科技 > LeetCode基础算法题第1185.Day of the Week

LeetCode基础算法题第1185.Day of the Week

技术提高是一个循序渐进的过程,所以我讲的leetcode算法题从最简单的level开始写的,然后到中级难度,最后到hard难度全部完。目前我选择C语言,Python和Java作为实现语言,因为这三种语言还是比较典型的。由于篇幅和精力有限,其他语言的实现有兴趣的朋友请自己尝试。如果有任何问题可以在文章后评论或者私信给我。如果有朋友希望我讲些其他话题,请在评论区留言或者私信给我。持续分享,敬请关注。

LeetCode 1185. 给定一个日期求星期几(Day of the Week)

问题描述:

给定一个日期,求该日期是星期几。

输入是三个整数,分别表示日、月和年。返回英文的星期字符串:

"Sunday"、"Monday"、"Tuesday"、"Wednesday"、"Thursday"、"Friday"、"Saturday"

注:

给定日期为1971年至2100年之间的有效日期;

示例:

C语言实现:

这道题太简单,我不知道它要考什么。

对于java和python来说,用自带的库仅用一句代码就可实现。

对于C语言来说可能稍微复杂,我的实现是先将年月日连接起来组成一个日期字符串,随便哪种格式都可以。然后交给strptime()生成一个struct tm对象time,struct tm结构如下:

然后调用strftime(),将time格式化成我们想要的星期字符串即可。

代码如下:

注意这其中涉及到日期格式描述字段:

%Y :年;

%m :月;

%d :日;

%F :等价于 %Y-%m-%d;

%A :星期的全称;

面试的话,估计不会考这个,太简单了,如果面试人员希望你不用库函数实现的话,那么就比较复杂了。

一般思路是这样的:

我们显然是知道当前日期是星期几的,然后计算给定日期到当前日期的天数差diff;

设:i = diff % 7;arr = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];

那么 arr[i] 就是该日期的星期信息。

这个算法复杂的地方是计算diff,因为牵涉到是否闰月的情况。

此外,我查询了一些资料,发现计算日期的算法还挺多,有些算法还是比较复杂的,我们这里只分享一个比较快速简洁的算法。

该算法是一个叫坂本智彦的日本人在1992年发表的,这个算法对于任何1752年之后的日期都是准确的。

代码如下:

其中arr是一个长度为13的数组,除了第一个元素,其他元素的值为

arr这个数组是另一个由数学家高斯提出的星期的算法中的一个月份偏移查询表。这里就不描述了,因为它是一个常数表。感兴趣的可以去搜索一下。

坂本智彦的这个算法,我没有找到更详细的说明文章,我还不知道为什么最后是这样一个表达式。了解的朋友可以在评论去分享。

Java语言实现:

Java 的实现和C语言的实现一致,不再撰述。代码如下:

Python语言实现:

Python 的实现和C语言的实现一致,不再撰述。代码如下:


本文来自投稿,不代表本人立场,如若转载,请注明出处:http://www.souzhinan.com/kj/221945.html