题目描述
给你一个按 YYYY-MM-DD
格式表示公元纪年法格里高利历 日期的字符串 date
,请你计算并返回该日期是当年的第几天。
样例
输入:date = "2019-01-09"
输出:9
解释:给定的日期是 2019 年的第 9 天。
输入:date = "2019-02-10"
输出:41
输入:date = "2003-03-01"
输出:60
输入:date = "2004-03-01"
输出:61
限制
date.length == 10
date[4] == date[7] == '-'
,其他的date[i]
都是数字。date
表示的范围从 1900 年 1 月 1 日至 2019 年 12 月 31 日。
算法
(模拟) $O(1)$
- 用一个常数数组记录每个月分别有多少天。
- 将年月日从字符串中提取出来,然后累加小于当前月的月份有多少天。
- 最后累加当前月有多少天。注意特判闰年。
时间复杂度
- 一切操作都是常数时间复杂度。
空间复杂度
- 同样为常数。
C++ 代码
class Solution {
public:
int dayOfYear(string date) {
const int md[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int y = 0;
for (int i = 0; i < 4; i++)
y = y * 10 + date[i] - '0';
int m = 0;
for (int i = 5; i < 7; i++)
m = m * 10 + date[i] - '0';
int d = 0;
for (int i = 8; i < 10; i++)
d = d * 10 + date[i] - '0';
int ans = 0;
for (int i = 1; i < m; i++)
ans += md[i];
ans += d;
if (m > 2 && (y % 4 == 0 && y % 100 != 0 || y % 400 == 0))
ans++;
return ans;
}
};