题解
题目描述
小C点了一个外卖并急切等待送达,想知道外卖是否超时。已知小C在时刻 t1 点了外卖,预计送达时间为 t2,实际送达时间为 t3,需要判断外卖是否超时。如果实际送达时间 t3 在预计送达时间 t2 之后且不超过 2 小时,则认定为超时。
思路分析
为了判断外卖是否超时,我们首先需要将时间转化为统一的度量单位——分钟数。具体来说,我们将 t1、t2 和 t3 转换为从当天零点开始的分钟数,然后进行比较。
- 时间转换: 将
t2和t3转换为从当天 00:00 开始的分钟数,便于进行时间差的计算。 - 判断超时: 如果
t3在t2之后,且t3和t2之间的差值小于 2 小时(即 120 分钟),那么就认为外卖超时。
代码解析
TWO_HOURS = 2 * 60 # 2小时对应的分钟数
def time_to_minutes(time):
""" 将时间转换为从当天 00:00 开始的分钟数 """
hours, minutes = map(int, time.split(":")) # 将时间字符串拆分为小时和分钟
return hours * 60 + minutes # 将小时和分钟转换为分钟数
def solution(t1: str, t2: str, t3: str) -> str:
# 将时间转为分钟数
t2_minutes = time_to_minutes(t2) # 预计送达时间
t3_minutes = time_to_minutes(t3) # 实际送达时间
# 判断超时
if t3_minutes > t2_minutes and t3_minutes - t2_minutes < TWO_HOURS:
return "Yes" # 超过预计时间且在2小时内,超时
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') # 实际送达时间在预计时间前,不超时
代码解析:
-
时间转换函数 (
time_to_minutes):- 将时间字符串
HH:MM解析为小时和分钟。 - 通过
hours * 60 + minutes将其转化为从当天 00:00 开始的分钟数。这样可以避免跨天时间带来的复杂性。
- 将时间字符串
-
主函数 (
solution):- 先将预计送达时间
t2和实际送达时间t3转换为分钟数。 - 比较
t3是否大于t2,即是否超时,并判断超时的时间差是否小于 2 小时(120 分钟)。如果满足条件,则返回 "Yes",表示超时;否则返回 "No"。
- 先将预计送达时间
测试样例解析
-
样例 1: 输入:
t1 = "18:00", t2 = "19:05", t3 = "19:05"t2和t3均为 19:05,因此没有超时,输出 "No"。
-
样例 2: 输入:
t1 = "23:00", t2 = "00:21", t3 = "00:23"t3是 00:23,超出了预计送达时间 00:21,且差值小于 2 小时,输出 "Yes"。
-
样例 3: 输入:
t1 = "23:05", t2 = "00:05", t3 = "23:58"t3是 23:58,虽然接近 00:05,但在预计时间之前,输出 "No"。
总结
- 时间转换是解决这个问题的关键步骤,通过将时间转化为分钟数来统一比较。
- 通过计算
t3和t2之间的差值,可以判断外卖是否超时。 - 处理了跨天问题,只需要将时间转化为分钟数后即可避免跨天导致的麻烦。