1154. 一年中的第几天
大约 2 分钟
---
1154. 一年中的第几天
- 标签:数学、字符串
- 难度:简单
题目链接
题目大意
描述:给定一个字符串 ,格式为 YYYY-MM-DD(年-月-日)。
要求:返回这个日期是当年的第几天。
说明:
- 。
- ,其他字符都是数字。
- 日期范围: 年 月 日至 年 月 日。
示例:
- 示例 1:
输入:date = "2019-01-09"
输出:9
解释:1 月 9 日就是 2019 年的第 9 天。- 示例 2:
输入:date = "2019-02-10"
输出:41
解释:1 月有 31 天,加上 2 月的 10 天,总共 31 + 10 = 41 天。解题思路
思路 1:逐月累加
这道题就是算个「月份累加账」:把目标月份之前的所有月份的天数加起来,再加上当月的天数。
关键是要处理闰年。 闰年的 2 月有 29 天,平年的 2 月只有 28 天。
判断闰年的规则(记住这个口诀):四年一闰,百年不闰,四百年再闰。
- 能被 400 整除 → 是闰年(比如 2000 年)。
- 能被 4 整除但不能被 100 整除 → 是闰年(比如 2004 年)。
- 其他情况 → 不是闰年。
步骤拆解:
- 把日期字符串按
-拆开,得到年、月、日。 - 准备一个数组,记录平年每个月的天数:
[31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]。 - 判断当年是不是闰年,如果是闰年就把 2 月的天数改成 29。
- 把「当前月之前」的所有月份的天数加起来,再加上当前月的天数。
比如 3 月 5 日:先加 1 月的 31 天,加 2 月的 28(或 29)天,再加 5 天。
思路 1:代码
class Solution:
def dayOfYear(self, date: str) -> int:
# 第 1 步:拆解日期字符串,得到年、月、日
year, month, day = map(int, date.split('-'))
# 第 2 步:平年每个月的天数
days_in_month = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
# 第 3 步:判断闰年
is_leap = (year % 400 == 0) or (year % 4 == 0 and year % 100 != 0)
# 如果是闰年,2 月有 29 天
if is_leap:
days_in_month[1] = 29
# 第 4 步:累加前 month-1 个月的天数,再加上当月的天数
result = sum(days_in_month[:month - 1]) + day
return result思路 1:复杂度分析
- 时间复杂度:。不管哪年哪天,计算量都是固定的。
- 空间复杂度:。只用了几个固定变量。