LeetCode 1360. 日期之间隔几天
题目描述
思路分析
解法一:日期转天数(推荐)
核心思路:
- 将日期转换为从固定起点(如 1971-01-01)到该日期的天数。
- 两日期天数差的绝对值即为结果。
- 闰年规则与常规日期计算一致。
复杂度分析:
- 时间复杂度:O(1)。
- 空间复杂度:O(1)。
class Solution {
public int daysBetweenDates(String date1, String date2) {
int d1 = daysFrom1971(date1);
int d2 = daysFrom1971(date2);
return Math.abs(d1 - d2);
}
private int daysFrom1971(String date) {
int year = Integer.parseInt(date.substring(0, 4));
int month = Integer.parseInt(date.substring(5, 7));
int day = Integer.parseInt(date.substring(8, 10));
int[] days = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int res = 0;
for (int y = 1971; y < year; y++) {
res += isLeap(y) ? 366 : 365;
}
for (int m = 1; m < month; m++) {
res += days[m - 1];
if (m == 2 && isLeap(year)) {
res++;
}
}
res += day;
return res;
}
private boolean isLeap(int year) {
return (year % 400 == 0) || (year % 4 == 0 && year % 100 != 0);
}
}
func daysBetweenDates(date1 string, date2 string) int {
d1 := daysFrom1971(date1)
d2 := daysFrom1971(date2)
if d1 > d2 {
return d1 - d2
}
return d2 - d1
}
func daysFrom1971(date string) int {
year := atoi(date[0:4])
month := atoi(date[5:7])
day := atoi(date[8:10])
days := []int{31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
res := 0
for y := 1971; y < year; y++ {
if isLeap(y) {
res += 366
} else {
res += 365
}
}
for m := 1; m < month; m++ {
res += days[m-1]
if m == 2 && isLeap(year) {
res++
}
}
res += day
return res
}
func isLeap(year int) bool {
return (year%400 == 0) || (year%4 == 0 && year%100 != 0)
}
func atoi(s string) int {
val := 0
for i := 0; i < len(s); i++ {
val = val*10 + int(s[i]-'0')
}
return val
}
相似题目
| 题目 | 难度 | 考察点 |
|---|---|---|
| 1360. 日期之间隔几天 | 简单 | 日期计算 |
| 1154. 一年中的第几天 | 简单 | 日期计算 |
| 1185. 一周中的第几天 | 简单 | 日期计算 |
| 1893. 检查是否区域内所有整数都被覆盖 | 简单 | 计数 |
| 258. 各位相加 | 简单 | 数学 |
本博客所有文章除特别声明外,均采用
CC BY-NC-SA 4.0
许可协议,转载请注明出处!