豆包MarsCode AI刷题

114 阅读4分钟

一、题目理解与分析

小C的外卖超时判断

小C点了一个外卖,并且急切地等待着骑手的送达。她想知道她的外卖是否超时了。

已知小C在时刻 t1 点了外卖,外卖平台上显示的预计送达时间为 t2,而实际送达时间为 t3。需要判断外卖是否超时。如果外卖超时,则输出 "Yes";否则输出 "No"

实际送达时间与预计送达时间在 2 小时之内。


测试样例

示例 1:

输入:t1 = "18:00", t2 = "19:05", t3 = "19:05"
输出:"No"

示例 2:

输入:t1 = "23:00", t2 = "00:21", t3 = "00:23"
输出:"Yes"

示例 3:

输入:t1 = "23:05", t2 = "00:05", t3 = "23:58"
输出:"No"

从上述示例可以看出,某些输入中时间会跨越午夜(如 23:00 到 00:21),需要特别注意跨越24小时的时间处理。

二、解题思路与方法

为了解决该问题,主要思路是将时间转换为分钟数进行比较。在转换过程中要考虑以下关键点:

  1. 时间转分钟数:将时间 HH:MM 转换为分钟数 totalMinutes = hours * 60 + minutes。

  2. 跨越午夜的情况:如果 t2 或 t3 比 t1 小,说明时间跨越了午夜,需将其视为次日的时间,例如凌晨 00:21 可以看作是 24:21。

  3. 比较实际送达时间和预计送达时间:通过转换为分钟数的 t2 和 t3 直接比较,若 t3 > t2,则外卖超时。

这种方案不仅清晰、易于理解,还能轻松处理跨越午夜的时间情况。


    // 将时间字符串转换为分钟数
    private static int timeToMinutes(String time) {
        String[] parts = time.split(":");
        int hours = Integer.parseInt(parts[0]);
        int minutes = Integer.parseInt(parts[1]);
        return hours * 60 + minutes;
    }

    public static String isDeliveryLate(String t1, String t2, String t3) {
        int startTime = timeToMinutes(t1);
        int estimatedTime = timeToMinutes(t2);
        int actualTime = timeToMinutes(t3);

        // 如果预计送达时间跨过午夜,调整分钟数
        if (estimatedTime < startTime) {
            estimatedTime += 24 * 60;  // 把预计时间视为次日的时间
        }

        // 同样,如果实际送达时间跨过午夜,调整分钟数
        if (actualTime < startTime) {
            actualTime += 24 * 60;  // 把实际时间视为次日的时间
        }

        // 判断是否超时
        return actualTime > estimatedTime ? "Yes" : "No";
    }

    public static void main(String[] args) {
        // 测试示例
        System.out.println(isDeliveryLate("18:00", "19:05", "19:05"));  // 输出: No
        System.out.println(isDeliveryLate("23:00", "00:21", "00:23"));  // 输出: Yes
        System.out.println(isDeliveryLate("23:05", "00:05", "23:58"));  // 输出: No
    }
}
  1. timeToMinutes 方法:将时间字符串转换为当天的分钟数。小时转化为60倍的分钟数后加上当前的分钟数。

  2. isDeliveryLate 方法:计算实际送达时间 t3 是否超过预计送达时间 t2。

跨越午夜处理:如果预计送达时间 t2 或实际送达时间 t3 小于下单时间 t1,则认为其为次日的时间,通过加 24*60 来将其转换为次日时间的分钟表示。

判断超时:比较 actualTime 和 estimatedTime,若 actualTime 大于 estimatedTime,则判断为超时,返回 "Yes";否则返回 "No"。

四、优化思考

这道题通过简单的字符串解析和数学转换完成了任务,但是在更复杂的场景中,比如需要计算多个时间的交互、定时提醒或预估,或许需要更高级的时间管理方式。对于复杂时间的处理,Java的 LocalTime、LocalDateTime 等类提供了更为灵活的解决方案,例如在涉及时区或日期跨度较长的情况下。使用这些类虽然在简单任务中略显冗余,但在更复杂场景下的表现会非常出色。

五、总结与反思

  1. 基础思维的重要性:这道题目涉及时间转换与跨越午夜的特殊情况处理,是对基础编程思维的良好训练。虽然没有复杂的数据结构或算法,但需要耐心和细致的逻辑。

  2. 代码简洁性:在处理时间问题时,通过将时间统一转换为分钟数,使代码更为简洁和可读。在实际项目中,简洁的代码可以更高效地被他人理解和维护。

  3. 未来拓展:如果有更多需求(如多时区、日期跨度),可以考虑使用Java的 LocalTime 等类,以提高代码的扩展性和复用性。

此类时间判断题目不仅仅适用于简单的时刻判断,还可以拓展到很多实时监控、报警等场景,提供了诸多应用价值。