龙空技术网

LeetCode基础算法题第1154. Day of the Year

吾是我师 236

前言:

如今咱们对“年历系统c语言”可能比较关注,咱们都想要分析一些“年历系统c语言”的相关资讯。那么小编在网络上搜集了一些有关“年历系统c语言””的相关知识,希望你们能喜欢,咱们快快来了解一下吧!

技术提高是一个循序渐进的过程,所以我讲的leetcode算法题从最简单的level开始写的,然后> 到中级难度,最后到hard难度全部完。目前我选择C语言,Python和Java作为实现语言,因为这三种语言还是比较典型的。由于篇幅和> 精力有限,其他语言的实现有兴趣的朋友请自己尝试。

如果有任何问题可以在文章后评论或者私信给我。

如果有朋友希望我讲些其他话题,请在评论区留言或者私信给我。

持续分享,敬请关注。

LeetCode 1154. 一年中的第几天(Day of the Year)

问题描述:

给定字符串date,表示格式为YYYY-MM-DD的公历日期,请计算该日期是该年度的第几天,并返回。

注:

date.length == 10;date[4] == date[7] == '-', 其他所有date[i]的都是数字;date表示1900年1月1日至2019年12月31日之间的日历日期;示例:C语言实现:

如果date = "2019-04-15",我们只要计算出1~3月的天数再加上4月份的这15天就可以了。

首先要从date字符串中分别解析出年月日,y,m,d。

按照一般方法,我们需要一个每月天数列表days,然后根据解析出的月份查表累加,在加上最后的天数。

这种方法需要根据m的值遍历days,如果m等于12 就需要遍历整个days。

为了省去这种遍历,我们可以重新定义days的内容,记录的不再是每一个月的天数,而是累加天数。

int days[] = {0, 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334}

例如,如果m=4那么days[m]=90,记录的就是1~3月的日期总数,即,31+28+31=90。

这里我们定义的days的长度是13,下标0的元素只起到占位作用没实际意义,为了避免查找days时额外的减一操作。

现在我们来考虑遇到闰年的情况。

首先我们定义days的时候是不考虑闰年的。闰年比一般般年份的2月多1天,是29天。所以只有m大于2的时候才需要考虑闰年。

我们知道满足闰年的条件有两个:

如果年份可以被400整除,是一个世纪闰年;如果年份能被4整除且不能被100整除的是普通闰年;

判断出闰年后,将上述结果累加,返回即可。

代码如下:

Java语言实现:

Java 的实现和C语言的实现一致。

这里要注意的是,我们没有用split方法分割字符串,而是用substring方法,类似切片一样获取年月日。

这里能用substring是因为备注中给定了必要条件:date[4] == date[7] == '-'。否则是不能用substring的。

经过测试,用substring性能会稍微好一些。

代码如下:

Python语言实现:

python要解决此类问题通常会选择用datetime库来实现。

代码如下:

但是由于本题是一个很简单的问题,用我们上面描述的方法,效率会更好一些。

代码如下:

标签: #年历系统c语言