统计共同度过的日子数
难度:
标签:
题目描述
代码结果
运行时间: 20 ms, 内存: 16.1 MB
/*
题目思路:
1. 使用Java Stream API转换日期并计算重叠天数。
2. 首先将日期字符串转换为年内的第几天。
3. 使用Stream计算重叠天数。
*/
import java.util.Arrays;
public class SolutionStream {
private static final int[] DAYS_IN_MONTH = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
// 将日期转换为年内的第几天
private int convertToDayOfYear(String date) {
String[] parts = date.split("-");
int month = Integer.parseInt(parts[0]);
int day = Integer.parseInt(parts[1]);
return Arrays.stream(DAYS_IN_MONTH, 0, month - 1).sum() + day;
}
public int countDaysTogether(String arriveAlice, String leaveAlice, String arriveBob, String leaveBob) {
int arriveAliceDay = convertToDayOfYear(arriveAlice);
int leaveAliceDay = convertToDayOfYear(leaveAlice);
int arriveBobDay = convertToDayOfYear(arriveBob);
int leaveBobDay = convertToDayOfYear(leaveBob);
// 计算重叠的开始和结束日期
int startOverlap = Math.max(arriveAliceDay, arriveBobDay);
int endOverlap = Math.min(leaveAliceDay, leaveBobDay);
// 计算重叠天数
return Math.max(0, endOverlap - startOverlap + 1);
}
}
解释
方法:
首先,题解采用了一个有效的日期转换方法,将日期从 'MM-DD' 格式转换为一年中的第几天。这是通过累加每月的天数直到给定的月份,并加上日数来实现的。接着,题解找出了 Alice 和 Bob 在城市中同时存在的日期区间,即从最晚到达的那天到最早离开的那天。如果这个区间有效(即开始日期不晚于结束日期),则计算这个区间内的天数;如果区间无效(开始日期晚于结束日期),则返回 0。这样可以直接计算出 Alice 和 Bob 同时在城市的天数。
时间复杂度:
O(1)
空间复杂度:
O(1)
代码细节讲解
🦆
在确定Alice和Bob同时在城市的日期区间时,为什么选择使用max函数来确定开始日期,而使用min函数来确定结束日期?
▷🦆
函数tarn中为什么要遍历月份直到给定的月份而不是直接使用数组索引来获得之前月份的总天数?
▷🦆
如果输入的日期格式不正确,比如月份或日期超出有效范围,这个算法怎么处理?
▷🦆
在比较日期字符串时,直接使用字符串比较的结果是否总是准确的?例如,'10-01' 是否会被认为小于 '09-30'?
▷