小C的外卖超时判断 | 豆包MarsCode AI刷题

114 阅读5分钟

判断外卖是否超时:详细思路与代码解析

小C点了一份外卖,并急切地等待骑手送达。她希望知道外卖是否超时。为了实现这个目标,我们需要编写一个程序,根据外卖的下单时间、预计送达时间和实际送达时间,判断是否超时。以下是对该问题的详细分析和解决过程。


问题分析

问题的核心是比较时间点 t3(实际送达时间)与 t2(预计送达时间)之间的大小关系。如果 t3 晚于 t2,则外卖超时,输出 "Yes";否则未超时,输出 "No"

需要注意的是,这里的时间点是以 小时:分钟 的形式给出的,并且存在跨越午夜的情况。例如:

  • 如果 t1 = 23:00t2 = 00:30,则实际送达时间可能出现在第二天。

因此,我们需要在处理时间时引入统一的表示形式,确保计算逻辑能够准确覆盖跨越午夜的情形。


解题思路

为了正确判断外卖是否超时,可以按照以下步骤设计程序:

  1. 时间字符串解析:将输入的时间(如 "18:00", "23:00")转化为以分钟为单位的整数值,从 00:00(午夜)开始计时。例如:

    • "18:00" 对应 18 * 60 = 1080 分钟。
    • "23:00" 对应 23 * 60 = 1380 分钟。
  2. 处理跨越午夜的情况

    • 如果预计送达时间 t2 早于下单时间 t1,说明 t2 实际上是在第二天,需要将其映射到同一天时间线上。
    • 同理,如果实际送达时间 t3 早于下单时间 t1,也需要调整到第二天。
  3. 超时判断

    • 对调整后的 t2t3 比较大小:
      • 如果 t3 > t2,说明外卖超时,返回 "Yes"
      • 否则返回 "No"
  4. 输出结果:根据比较结果输出对应的答案。


实现步骤与代码

下面是具体的 Python 实现:

def parse_time_to_minutes(time_str):
    """将时间字符串转换为从午夜开始的分钟数"""
    hours, minutes = map(int, time_str.split(':'))
    return hours * 60 + minutes

def is_overtime(t1, t2, t3):
    """判断外卖是否超时"""
    # 将时间转换为从午夜开始的分钟数
    t1_minutes = parse_time_to_minutes(t1)
    t2_minutes = parse_time_to_minutes(t2)
    t3_minutes = parse_time_to_minutes(t3)

    # 跨越午夜的调整
    if t2_minutes < t1_minutes:
        t2_minutes += 24 * 60
    if t3_minutes < t1_minutes:
        t3_minutes += 24 * 60

    # 判断实际送达时间是否晚于预计送达时间
    return "Yes" if t3_minutes > t2_minutes else "No"

# 测试样例
print(is_overtime("18:00", "19:05", "19:05"))  # 输出 "No"
print(is_overtime("23:00", "00:21", "00:23"))  # 输出 "Yes"
print(is_overtime("23:05", "00:05", "23:58"))  # 输出 "No"

代码解析

  1. 时间解析

    • 函数 parse_time_to_minutes 接收一个时间字符串(例如 "18:00"),将其拆分为小时和分钟,计算从午夜开始的总分钟数。
    • 例如,"18:00" 解析后为 18 * 60 = 1080 分钟。
  2. 跨越午夜的处理

    • 如果预计送达时间 t2 或实际送达时间 t3 早于下单时间 t1,说明这些时间点已经跨越午夜,我们需要加上 24 * 60 = 1440 分钟,使其落在第二天。
  3. 超时判断

    • 比较调整后的 t3t2
      • 如果 t3 > t2,则超时。
      • 否则未超时。

测试与验证

以下是一些测试用例,验证代码的正确性:

样例 1

  • 输入:t1 = "18:00", t2 = "19:05", t3 = "19:05"
  • 解析:
    • t1 = 1080 分钟,t2 = 1145 分钟,t3 = 1145 分钟。
    • 比较:t3 = 1145 <= t2 = 1145,未超时。
  • 输出:"No"

样例 2

  • 输入:t1 = "23:00", t2 = "00:21", t3 = "00:23"
  • 解析:
    • t1 = 1380 分钟,t2 = 21 + 1440 = 1461 分钟,t3 = 23 + 1440 = 1463 分钟。
    • 比较:t3 = 1463 > t2 = 1461,超时。
  • 输出:"Yes"

样例 3

  • 输入:t1 = "23:05", t2 = "00:05", t3 = "23:58"
  • 解析:
    • t1 = 1385 分钟,t2 = 5 + 1440 = 1445 分钟,t3 = 1438 分钟。
    • 比较:t3 = 1438 <= t2 = 1445,未超时。
  • 输出:"No"

复杂度分析

  1. 时间复杂度

    • 解析时间字符串和简单的加法、比较操作均为 O(1)
    • 总复杂度为 O(1)
  2. 空间复杂度

    • 使用常数数量的辅助变量,复杂度为 O(1)

总结

这道题的核心在于正确处理时间的跨越午夜情况,并通过统一的分钟表示法实现时间的比较。本文通过详细的代码实现和测试样例,展示了解决问题的完整过程。关键点包括时间解析、跨越午夜的处理和高效的比较逻辑。通过这种方法,我们可以轻松判断外卖是否超时,为小C解决她的疑问!