个人认为,这道题更注重考察数学计算思维。
题:
Alice 和 Bob 计划分别去罗马开会。
给你四个字符串 arriveAlice ,leaveAlice ,arriveBob 和 leaveBob 。Alice 会在日期 arriveAlice 到 leaveAlice 之间在城市里(日期为闭区间),而 Bob 在日期 arriveBob 到 leaveBob 之间在城市里(日期为闭区间)。每个字符串都包含 5 个字符,格式为 "MM-DD" ,对应着一个日期的月和日。
请你返回 Alice和 Bob 同时在罗马的天数。
你可以假设所有日期都在 同一个 自然年,而且 不是 闰年。每个月份的天数分别为:[31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] 。
来源:力扣(LeetCode)
class Solution {
public int countDaysTogether(String arriveAlice, String leaveAlice, String arriveBob, String leaveBob) {
int[] datesOfMonths = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int[] prefixSum = new int[13];
for (int i = 0; i < 12; i++) {
prefixSum[i + 1] = prefixSum[i] + datesOfMonths[i];
}
int arriveAliceDay = calculateDayOfYear(arriveAlice, prefixSum);
int leaveAliceDay = calculateDayOfYear(leaveAlice, prefixSum);
int arriveBobDay = calculateDayOfYear(arriveBob, prefixSum);
int leaveBobDay = calculateDayOfYear(leaveBob, prefixSum);
return Math.max(0, Math.min(leaveAliceDay, leaveBobDay) - Math.max(arriveAliceDay, arriveBobDay) + 1);
}
public int calculateDayOfYear(String day, int[] prefixSum) {
int month = Integer.parseInt(day.substring(0, 2));
int date = Integer.parseInt(day.substring(3));
return prefixSum[month - 1] + date;
}
}
注意最后返回值的写法,运用了交集的思想,非常巧妙。
积累日期计算的方法。