java 日期加上几天_LeetCode基础算法题第157篇:一年中的第几天

f6ca0b2bb1cf419626c5066edf552891.png

技术提高是一个循序渐进的过程,所以我讲的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日之间的日历日期;

示例:

a6758b392826ef39877e7c50ac5ebcad.png

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的时候才需要考虑闰年。

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

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

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

代码如下:

fd548ec6597fc27466a012ade70e29ee.png
c13abc37ca26873b1eefb4d37c88b56b.png

Java语言实现:

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

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

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

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

代码如下:

be3db02a2881c98d783691ee902dcbbd.png
8e06afdef43f2e58e92b33e72178e5ad.png

Python语言实现:

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

代码如下:

480dd163b7ff55096ebf6b60390a4a02.png

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

代码如下:

a6df669fd41045fa1a683ddfb9153ac1.png
7baae65125d1d6bf983f5453b9364325.png

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值