一年中的第几天

标签: 数学 字符串

难度: Easy

给你一个字符串 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 日

Submission

运行时间: 36 ms

内存: 0.0 MB

#
# @lc app=leetcode id=1154 lang=python3
#
# [1154] Day of the Year
#


class Solution:
    def dayOfYear(self, date: str) -> int:
        calendar = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
        y, m, d = map(int, date.split('-'))
        d += sum(calendar[:m])
        if ((y % 100 and not y % 4) or (not y % 100 and not y % 400)) and m > 2:
            d += 1
        return d

Explain

该题解首先定义了一个列表 `calendar`,该列表以0开始,接着是每个月的天数,不考虑闰年的2月份。接着,通过字符串分割,将输入日期的年、月、日提取出来并转换为整数。累加到目前月份之前所有月份的天数得到 `d`。如果当前年份是闰年并且日期在2月之后,额外加一天。判断闰年的条件是:年份能被4整除但不能被100整除,或者能被400整除。最后返回从年初到当前日期的总天数。

时间复杂度: O(1)

空间复杂度: O(1)

#
# @lc app=leetcode id=1154 lang=python3
#
# [1154] Day of the Year
#


class Solution:
    def dayOfYear(self, date: str) -> int:
        # 初始化每月的天数,2月默认为非闰年的28天
        calendar = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
        # 分割日期字符串并转换为整数
        y, m, d = map(int, date.split('-'))
        # 累加到当前月份之前的所有月份的天数
        d += sum(calendar[:m])
        # 检查是否为闰年,如果是且月份大于2月,则加一天
        if ((y % 100 and not y % 4) or (not y % 100 and not y % 400)) and m > 2:
            d += 1
        # 返回年初至当前日期的天数总和
        return d

Explore

在初始化月份天数列表时将2月默认设置为28天是为了简化问题的解决过程。这种方法使得列表可以直接初始化而不需要先判断输入的年份是否为闰年。然后通过后续的逻辑检查来调整闰年2月的天数。这样做的好处是代码更加清晰和易于管理,特别是在处理不同年份时不必重复初始化月份天数列表。

题解中的闰年判断条件确实与常规的判断条件有所不同,实际上题解中的条件存在错误。标准的闰年判断条件是`(y % 4 == 0 and y % 100 != 0) or (y % 400 == 0)`,意味着年份应当能被4整除但不能被100整除,或者能被400整除。题解中的条件漏写了逻辑运算符的关系,正确的应该是`(y % 4 == 0 and y % 100 != 0) or (y % 400 == 0)`。

这种设计选择是为了保持月份天数列表的统一性和简化逻辑处理。如果在列表中直接调整2月的天数,每次使用这个算法时都需要根据年份先判断并设置2月的天数,这样会使得代码更加复杂。通过在计算完所有月份天数后统一检查是否为闰年并适当增加一天,可以使得代码结构更简单,也易于理解和维护。

是的,当前的算法逻辑可以正确处理闰年的2月29日。算法首先会计算到2月28日为止的天数,然后在检查年份是闰年且当前月份大于2月时,会在总天数中额外加一天。所以如果输入是闰年的2月29日,算法会正确地将这一天计算在内,返回正确的天数总和。