LeetCode-1154.一年中的第几天

LeetCode-1154.一年中的第几天

  题目链接(微信打开):https://mp.weixin.qq.com/s/UeElxI9HLZyBH_VFC9bqtQ

一、题目描述(我精简过)

  给你一个字符串格式为:YYMM-MM-DD,返回该日期是当年的第几天。

  样例:,

  2019-01-09,是2019年的第9天;

       2019-02-10,是2019年的第41天;

 

二、题目分析

  这道题没啥难度,只能说看到它是一种缘分,所以我就做了。。。

  基础题的枚举即可,当然也可以用前缀和。大致讲下思路两者思路~

  从大框架来说,首先第一件事肯定是判断给出的年份是闰年还是平年,闰年366,平年365,闰年2月份有29天,平年是28天。闰年的判断方法是:是400的倍数或者是4的倍数且不是100的倍数,转化为算术表达式就是:

year % 400 = 0 
或者 year
% 4 = 0 && year % 100 != 0

1、枚举的思路:

  定义一个数组:m[1], m[2], ..., m[11], m[12],分别保存每月的天数

## 闰年
m[1]=31, m[2]=29, m[3]=31, m[4]=30, m[5]=31, m[6]=30, m[7]=31, m[8]=31, m[9]=30, m[10]=31, m[11]=30, m[12]=31

## 平年
设置都跟闰年的值一样,除了:m[2]=28

  假如给出:YYMM-MM-DD,我们先判断YYMM是平年还是闰年,然后设置结果变量:ans=0,统计 1 ~ MM-1的和,最后加上DD就是答案。

for (i=1; i < MM; i++)
    ans += m[i]
ans += DD
print(ans)

 

2、前缀和思路:

  定义一个数组:s[1], s[2], ..., s[11], s[12],表示到 i 这个月份总共的天数,例如s[3]表示1~3月份的总天数,s[11]就是1~12月份的总天数。表达式变成这样

ans = s[MM-1] + DD
print(ans)

  前缀和相对直接枚举的优点是,不用每个样例都要重新算一遍,例如给了:2022-03-12, 2010-05-12, xxxxx,如果样例有n个,且都是12月,那时间复杂度最差的时候是O(n*12),但前缀和是O(n)。 (算错了告诉我)。

  其实也没优化多少,乘多个常数忽略不计咯,不过告诉大家发散点思考问题还是好滴~~~

posted @ 2022-03-12 22:07  windysai  阅读(42)  评论(0编辑  收藏  举报