判断外卖是否超时:详细思路与代码解析
小C点了一份外卖,并急切地等待骑手送达。她希望知道外卖是否超时。为了实现这个目标,我们需要编写一个程序,根据外卖的下单时间、预计送达时间和实际送达时间,判断是否超时。以下是对该问题的详细分析和解决过程。
问题分析
问题的核心是比较时间点 t3(实际送达时间)与 t2(预计送达时间)之间的大小关系。如果 t3 晚于 t2,则外卖超时,输出 "Yes";否则未超时,输出 "No"。
需要注意的是,这里的时间点是以 小时:分钟 的形式给出的,并且存在跨越午夜的情况。例如:
- 如果
t1 = 23:00,t2 = 00:30,则实际送达时间可能出现在第二天。
因此,我们需要在处理时间时引入统一的表示形式,确保计算逻辑能够准确覆盖跨越午夜的情形。
解题思路
为了正确判断外卖是否超时,可以按照以下步骤设计程序:
-
时间字符串解析:将输入的时间(如
"18:00","23:00")转化为以分钟为单位的整数值,从00:00(午夜)开始计时。例如:"18:00"对应18 * 60 = 1080分钟。"23:00"对应23 * 60 = 1380分钟。
-
处理跨越午夜的情况:
- 如果预计送达时间
t2早于下单时间t1,说明t2实际上是在第二天,需要将其映射到同一天时间线上。 - 同理,如果实际送达时间
t3早于下单时间t1,也需要调整到第二天。
- 如果预计送达时间
-
超时判断:
- 对调整后的
t2和t3比较大小:- 如果
t3 > t2,说明外卖超时,返回"Yes"; - 否则返回
"No"。
- 如果
- 对调整后的
-
输出结果:根据比较结果输出对应的答案。
实现步骤与代码
下面是具体的 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"
代码解析
-
时间解析
- 函数
parse_time_to_minutes接收一个时间字符串(例如"18:00"),将其拆分为小时和分钟,计算从午夜开始的总分钟数。 - 例如,
"18:00"解析后为18 * 60 = 1080分钟。
- 函数
-
跨越午夜的处理
- 如果预计送达时间
t2或实际送达时间t3早于下单时间t1,说明这些时间点已经跨越午夜,我们需要加上24 * 60 = 1440分钟,使其落在第二天。
- 如果预计送达时间
-
超时判断
- 比较调整后的
t3和t2:- 如果
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"
复杂度分析
-
时间复杂度
- 解析时间字符串和简单的加法、比较操作均为
O(1)。 - 总复杂度为
O(1)。
- 解析时间字符串和简单的加法、比较操作均为
-
空间复杂度
- 使用常数数量的辅助变量,复杂度为
O(1)。
- 使用常数数量的辅助变量,复杂度为
总结
这道题的核心在于正确处理时间的跨越午夜情况,并通过统一的分钟表示法实现时间的比较。本文通过详细的代码实现和测试样例,展示了解决问题的完整过程。关键点包括时间解析、跨越午夜的处理和高效的比较逻辑。通过这种方法,我们可以轻松判断外卖是否超时,为小C解决她的疑问!