0%

4-17每日

2409. 统计共同度过的日子数

Alice 和 Bob 计划分别去罗马开会。

给你四个字符串 arriveAliceleaveAlicearriveBobleaveBob 。Alice 会在日期 arriveAliceleaveAlice 之间在城市里(日期为闭区间),而 Bob 在日期 arriveBobleaveBob 之间在城市里(日期为闭区间)。每个字符串都包含 5 个字符,格式为 "MM-DD" ,对应着一个日期的月和日。

请你返回 Alice和 Bob 同时在罗马的天数。

你可以假设所有日期都在 同一个 自然年,而且 不是 闰年。每个月份的天数分别为:[31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]

示例 1:

输入:arriveAlice = "08-15", leaveAlice = "08-18", arriveBob = "08-16", leaveBob = "08-19"
输出:3
解释:Alice 从 8 月 15 号到 8 月 18 号在罗马。Bob 从 8 月 16 号到 8 月 19 号在罗马,他们同时在罗马的日期为 8 月 16、17 和 18 号。所以答案为 3 。

题解

主要还是输入处理的问题,将日期字符串分割,然后处理为日期数。

/**
 * @param {string} arriveAlice
 * @param {string} leaveAlice
 * @param {string} arriveBob
 * @param {string} leaveBob
 * @return {number}
 */
const monthDays = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];

var countDaysTogether = function(arriveAlice, leaveAlice, arriveBob, leaveBob) {
    // 用数组 `sum` 存储每个月的天数累加和
    let sum = [0];
    for (let i = 0; i < monthDays.length; ++i) &#123;
        sum.push(sum[i] + monthDays[i]);
    &#125;
    // 分别计算两个人到达日期和离开日期的天数
    let aA = calc(arriveAlice, sum);
    let lA = calc(leaveAlice, sum);
    let aB = calc(arriveBob, sum);
    let lB = calc(leaveBob, sum);
    // 根据到达和离开日期的天数计算旅行天数,即两个时间段的重合部分
    return Math.max(0, Math.min(lA, lB) - Math.max(aA, aB) + 1);
    
&#125;;

// 计算日期所对应的天数
function calc(day, sum) &#123;
    let month = parseInt(day.substring(0, 2));
    let date = parseInt(day.substring(3));
    return sum[month - 1] + date;
&#125;