1154.一年中的第几天

【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的倍数时为闰年

从给定字符串中,我们可以很方便地“分离出”年ymd,从1月到m - 1月累加这个月的天数,再加上d即为答案。

  • 时间复杂度$O(1)$,将一年的12个月视为常数
  • 空间复杂度$O(1)$

AC代码

C++

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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


1154.一年中的第几天
https://blog.letmefly.xyz/2023/12/31/LeetCode 1154.一年中的第几天/
作者
Tisfy
发布于
2023年12月31日
许可协议