leetcode
leetcode 2101 ~ 2150
统计共同度过的日子数

统计共同度过的日子数

难度:

标签:

题目描述

代码结果

运行时间: 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函数来确定结束日期?
使用max函数来确定开始日期是为了找到Alice和Bob两人中较晚到达城市的日期,因为只有两人都在城市时才算共同度过的日子。同理,使用min函数来确定结束日期是为了找到两人中较早离开城市的日期,这样才能确保计算的日期区间是两人都在城市的时间。这种方法能有效找出Alice和Bob共同在城市的有效日期区间。
🦆
函数tarn中为什么要遍历月份直到给定的月份而不是直接使用数组索引来获得之前月份的总天数?
函数tarn通过遍历月份并累加天数是为了将日期 'MM-DD' 格式转换为一年中的第几天。虽然使用数组索引直接获得之前月份的总天数看似更直接,但这需要另外创建一个累积天数的数组。在当前方法中,遍历月份并累加天数可以直接使用已定义的月份天数数组,从而简化代码和避免额外的数据结构。
🦆
如果输入的日期格式不正确,比如月份或日期超出有效范围,这个算法怎么处理?
当前算法版本没有明确处理输入日期格式不正确或日期数据超出有效范围的情况。如果输入的日期格式错误或超出范围,算法可能会返回不正确的结果或者引发运行时错误。在实际应用中,应该在调用核心算法前对输入数据进行验证,确保日期数据的有效性和正确性。
🦆
在比较日期字符串时,直接使用字符串比较的结果是否总是准确的?例如,'10-01' 是否会被认为小于 '09-30'?
在比较两个日期字符串时,如果字符串格式统一为 'MM-DD',那么直接通过字符串比较的结果是准确的,因为字符串比较是逐字符比较的。例如,'10-01' 会被认为大于 '09-30',因为 '10'(十月)在字典顺序中排在 '09'(九月)之后。这个特性使得直接使用字符串比较成为一种有效且简便的比较日期的方法。

相关问题