LeetCode 1154. 一年中的第几天:2023年最后一道每日一题
2023-12-31 13:46:44
【LetMeFly】1154.一年中的第几天:2023年最后一道每日一题
力扣题目链接:https://leetcode.cn/problems/day-of-the-year/
给你一个字符串?date
,按 YYYY-MM-DD
格式表示一个 现行公元纪年法 日期。返回该日期是当年的第几天。
?
示例 1:
输入:date = "2019-01-09" 输出:9 解释:给定日期是2019年的第九天。
示例 2:
输入:date = "2019-02-10" 输出:41
?
提示:
date.length == 10
date[4] == date[7] == '-'
,其他的?date[i]
?都是数字date
表示的范围从 1900 年 1 月 1 日至 2019 年 12 月 31 日
方法一:日期处理
首先明确一年中的12个月分别有几天(以非闰年为例):dayOfMonth = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
。
如果是闰年,那么2
月有29
天(dayOfMonth[1] = 29
)。
怎么判断一年是否为闰年呢?
- 如果年份是100的倍数,则只有年份为400的倍数时为闰年
- 否则,年份为4的倍数时为闰年
从给定字符串中,我们可以很方便地“分离出”年y
月m
日d
,从1
月到m - 1
月累加这个月的天数,再加上d
即为答案。
- 时间复杂度
O
(
1
)
O(1)
O(1),将一年的
12
个月视为常数 - 空间复杂度 O ( 1 ) O(1) O(1)
AC代码
C++
class Solution {
private:
int dayOfMonth[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
bool isRunNian(int y) {
if (y % 100 == 0) {
return y % 400 == 0;
}
return y % 4 == 0;
}
public:
int dayOfYear(string date) {
int y, m, d;
sscanf(date.c_str(), "%d-%d-%d", &y, &m, &d);
if (isRunNian(y)) {
dayOfMonth[1] = 29;
}
int ans = 0;
for (int i = 1; i < m; i++) {
ans += dayOfMonth[i - 1];
}
ans += d;
return ans;
}
};
Python
class Solution:
def ifRunNian(self, y: int) -> bool:
if y % 100 == 0:
return y % 400 == 0
return y % 4 == 0
def dayOfYear(self, date: str) -> int:
dayOfMonth = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
y, m, d = map(int, date.split('-'))
if self.ifRunNian(y):
dayOfMonth[1] = 29
ans = 0
for i in range(1, m):
ans += dayOfMonth[i - 1]
ans += d
return ans
同步发文于CSDN,原创不易,转载经作者同意后请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/135315004
文章来源:https://blog.csdn.net/Tisfy/article/details/135315004
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!