1360. 日期之间隔几天
大约 3 分钟
---
1360. 日期之间隔几天
- 标签:数学、字符串
- 难度:简单
题目链接
题目大意
描述:给定两个字符串形式的日期 和 ,格式为 YYYY-MM-DD。
要求:计算两个日期之间相差的天数(绝对值)。
说明:
- 输入的日期在 年到 年之间。
- 闰年判定规则:能被 整除但不能被 整除,或能被 整除。
示例:
- 示例 1:
输入:date1 = "2019-06-29", date2 = "2019-06-30"
输出:1- 示例 2:
输入:date1 = "2020-01-15", date2 = "2019-12-31"
输出:15解题思路
思路 1:公式计算
1. 核心思想
将两个日期分别转换为从公元元年(第 年)开始经过的总天数,然后计算差值取绝对值。这种方式将日期比较问题转化为整数比较,避免了复杂的借位计算。
计算某一天到公元元年的总天数,可以分解为:
- 整年的天数之和
- 整月的天数之和
- 当月已过的天数
2. 具体步骤
第 1 步:判断闰年
定义函数 :
- 如果 ,是闰年
- 如果 ,不是闰年
- 如果 ,是闰年
- 否则不是闰年
第 2 步:计算到公元元年的总天数
定义函数 :
累加 年到 年的天数(每年 天,闰年 天)。
累加 月到 月的天数(用月份天数数组,二月根据闰年判断)。
加上 。
第 3 步:返回绝对值差
。
3. 月份天数数组
平年月份天数:
闰年时,二月为 天。
4. 举例说明
以 , 为例:
计算 到公元元年的天数:
- 年总天数
- 年 月总天数:
- 年 月 天,加上 天 → (即 年全年)
计算 到公元元年的天数,减去 的,得到差值 。
思路 1:代码
class Solution:
def daysBetweenDates(self, date1: str, date2: str) -> int:
def is_leap(year):
"""判断闰年"""
return (year % 4 == 0 and year % 100 != 0) or (year % 400 == 0)
def days_from_epoch(year, month, day):
"""计算从公元元年到给定日期的总天数"""
# 整年天数
days = 0
for y in range(1971, year):
days += 366 if is_leap(y) else 365
# 月份天数
month_days = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
if is_leap(year):
month_days[1] = 29
for m in range(month - 1):
days += month_days[m]
# 当月天数
days += day
return days
# 解析日期字符串
y1, m1, d1 = map(int, date1.split('-'))
y2, m2, d2 = map(int, date2.split('-'))
return abs(days_from_epoch(y1, m1, d1) - days_from_epoch(y2, m2, d2))思路 1:复杂度分析
- 时间复杂度:,需要遍历年份计算整年天数,年份跨度最大约 年。
- 空间复杂度:,只使用了常数个变量。
思路 2:使用 Python 内置库
1. 核心思想
Python 的 datetime 库内置了日期计算功能,可以直接使用。
2. 思路 2:代码
from datetime import datetime
class Solution:
def daysBetweenDates(self, date1: str, date2: str) -> int:
d1 = datetime.strptime(date1, "%Y-%m-%d")
d2 = datetime.strptime(date2, "%Y-%m-%d")
return abs((d1 - d2).days)3. 思路 2:复杂度分析
- 时间复杂度:,库函数高效实现。
- 空间复杂度:。
思路 3:对比与总结
| 思路 | 优点 | 缺点 |
|---|---|---|
| 手算日期 | 不依赖外部库,面试中可直接实现 | 代码稍长 |
| 内置库 | 代码简洁,不易出错 | 面试中需确认是否允许使用 |
竞赛中推荐使用内置库,手算方法则适合面试场景。