一月有多少天

Submission

运行时间: 27 ms

内存: 16.0 MB

class Solution:
    def numberOfDays(self, year: int, month: int) -> int:
        # 创建一个包含每个月天数的列表,注意2月的天数需要根据是否是闰年来确定
        days_in_month = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
        
        # 判断是否是闰年
        if year % 4 == 0 and (year % 100 != 0 or year % 400 == 0):
            # 如果是闰年,2月有29天
            days_in_month[1] = 29
        
        # 返回指定月份的天数
        return days_in_month[month - 1]

# 示例用法
solution = Solution()
print(solution.numberOfDays(1992, 7))  # 输出: 31
print(solution.numberOfDays(2000, 2))  # 输出: 29
print(solution.numberOfDays(1900, 2))  # 输出: 28

Explain

此题解的思路是首先创建一个数组来存储每个月的天数,其中特别注意2月的天数可能因为闰年而变化。然后,通过年份来判断是否是闰年:如果年份能被4整除且不被100整除,或者能被400整除,则该年是闰年,此时2月应该有29天。最后,通过访问数组的方式,返回特定月份的天数。

时间复杂度: O(1)

空间复杂度: O(1)

class Solution:
    def numberOfDays(self, year: int, month: int) -> int:
        # 创建一个包含每个月天数的列表,注意2月的天数需要根据是否是闰年来确定
        days_in_month = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
        
        # 判断是否是闰年
        if year % 4 == 0 and (year % 100 != 0 or year % 400 == 0):
            # 如果是闰年,2月有29天
            days_in_month[1] = 29
        
        # 返回指定月份的天数
        return days_in_month[month - 1]

# 示例用法
solution = Solution()
print(solution.numberOfDays(1992, 7))  # 输出: 31
print(solution.numberOfDays(2000, 2))  # 输出: 29
print(solution.numberOfDays(1900, 2))  # 输出: 28

Explore

这些条件是历法上确定闰年的标准,旨在修正历法年与天文年的微小差异。简单地,如果每4年添加一天会稍微过多,因此每100年不闰来稍作减少,但这又过于减少了,所以每400年再增加一天来平衡。这种设计使得日历年与地球绕太阳运行的周期保持接近同步。

在数组中,索引通常是从0开始的。由于月份是从1至12编号的,所以为了正确映射到从0开始的数组索引,需要将月份值减1。例如,1月在数组中对应的索引是0,2月是1,依此类推。

如果输入的月份超出了1到12的范围,访问数组时将发生索引越界错误,因为数组只有12个元素。当前代码示例中没有显示的错误处理机制来处理这种情况,可能会导致程序崩溃或抛出异常。在实际应用中,应添加检查输入月份的合法性,或者在方法调用前验证数据。

数组因其简洁和访问速度快(O(1)时间复杂度)而被选择。在本问题中,每个月的天数可以通过一个固定的索引直接访问,这使得数组是一个非常合适的选择。虽然字典也可以实现相同的功能,但对于这种固定且有序的简单数据,数组更为高效且实现更为简单。