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)。 (算错了告诉我)。
其实也没优化多少,乘多个常数忽略不计咯,不过告诉大家发散点思考问题还是好滴~~~