LeetCode 1154. 一年中的第几天:2023年最后一道每日一题

【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 ) 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

你可能感兴趣的:(题解,#,力扣LeetCode,leetcode,算法,题解,日期计算)