个人题解|小C的外卖超时判断

3 阅读4分钟

问题描述

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

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

t3 在 t2 之后则认定为超时。

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

测试样例

示例 1:

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

为了解决这个问题,我们需要判断外卖的实际送达时间是否超出了预计的送达时间。如果实际送达时间(t3)晚于预计送达时间(t2),并且晚点的时间在2小时之内,则可以认为外卖超时。否则,外卖没有超时。

解决步骤:

  1. 输入时间格式:所有时间的格式是 "HH:MM",例如 "18:00"。我们需要将其转换为分钟数,便于比较。
  2. 转换时间为分钟数:我们可以通过 小时 * 60 + 分钟 来将 "HH:MM" 格式的时间转换为自午夜零点以来的分钟数。
  3. 比较:将 t2 和 t3 转换为分钟数后进行比较,如果 t3 超过 t2,则判定为超时。如果超出超过2小时,则为不合理数据。

解题思路:

  1. 将 t2 和 t3 分别转换为分钟数。
  2. 如果 t3 大于 t2 且 t3 - t2 <= 120,则输出 "Yes",表示超时。
  3. 否则输出 "No",表示没有超时。

代码实现:

def solution(t1, t2, t3):
    # 将时间转换为分钟数
    def time_to_minutes(time_str):
        hours, minutes = map(int, time_str.split(":"))
        return hours * 60 + minutes
    
    # 将 t2 和 t3 转换为分钟数
    t2_minutes = time_to_minutes(t2)
    t3_minutes = time_to_minutes(t3)
  
    # 判断是否超时
    if t3_minutes > t2_minutes and t3_minutes - t2_minutes <= 120:
        return "Yes"
    else:
        return "No"
if __name__ == '__main__':
    print(solution("18:00", "19:05", "19:05") == 'No')
    print(solution("23:00", "00:21", "00:23") == 'Yes')
    print(solution("23:05", "00:05", "23:58") == 'No')

解释:

  1. time_to_minutes(time_str):将时间字符串转换为从零点起的分钟数,方便进行比较。
  2. t2_minutes 和 t3_minutes 分别存储 t2 和 t3 转换后的分钟数。
  3. 如果实际送达时间 t3 晚于预计送达时间 t2,并且晚点不超过2小时(即 t3_minutes - t2_minutes <= 120),则认为超时,返回 "Yes"。否则返回 "No"

复杂度分析:

  • 时间复杂度:O(1),因为所有的操作都是常数时间复杂度。
  • 空间复杂度:O(1),只使用了少量的变量存储中间结果。

题外话:那如果t1 = "23:00", t2 = "00:21",这两个时间怎么转化比较?

t1 = "23:00"t2 = "00:21" 时,虽然这两个时间看起来在不同的日期,但我们可以通过统一转换为“自午夜零点以来的分钟数”来进行比较。因为一天是 24 小时制,所以需要考虑时间跨越午夜的情况。

解决思路

  1. 时间转换为分钟数:我们会先将两个时间转换为自午夜零点以来的分钟数。
  2. 处理跨越午夜的情况:因为 t2 = "00:21" 可能是第二天的时间,所以需要在 t2 计算时加上 24 小时的分钟数(即 1440 分钟)。这样就能避免跨越午夜时的错误比较。

转换步骤

1. 将时间转换为分钟数

  • 对于 t1 = "23:00",首先把小时 23 和分钟 00 转换为分钟数:

    t1_minutes=23×60+0=1380 分钟t1_minutes=23×60+0=1380分钟

  • 对于 t2 = "00:21",首先把小时 00 和分钟 21 转换为分钟数:

    t2_minutes=0×60+21=21 分钟t2_minutes=0×60+21=21分钟

    但是t2 实际上是跨过午夜的时间,所以我们需要加上 1440 分钟(一天的分钟数)来处理跨午夜的情况:

    t2_minutes_adjusted=21+1440=1461 分钟t2_minutes_adjusted=21+1440=1461分钟

2. 比较时间差

  • 现在,我们有:

    • t1_minutes = 1380(表示 23:00
    • t2_minutes_adjusted = 1461(表示 00:21,经过调整后)

    比较这两个时间的分钟数:

    时间差=1461−1380=81 分钟时间差=1461−1380=81分钟

    所以,t2 其实比 t1 晚 81 分钟。

    这样就确保了无论时间是否跨越午夜,都能准确地进行比较和计算时间差。

    (暂且到这,下次再见!)