问题描述
小C点了一个外卖,并且急切地等待着骑手的送达。她想知道她的外卖是否超时了。
已知小C在时刻 t1
点了外卖,外卖平台上显示的预计送达时间为 t2
,而实际送达时间为 t3
。需要判断外卖是否超时。如果外卖超时,则输出 "Yes"
;否则输出 "No"
。
t3
在 t2
之后则认定为超时。
实际送达时间与预计送达时间在 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"
这个问题要求我们判断实际送达时间 t3
是否超过了预计送达时间 t2
,超时的话输出 "Yes",否则输出 "No"。而且预计送达时间和实际送达时间之间的差异不超过2小时。
解题思路
- 我们需要将时间从字符串格式(例如
"18:00"
)转化为时间戳或者分钟数,便于比较。 - 将每个时间点
t1
,t2
, 和t3
转换为一天中的分钟数,这样可以方便地进行比较。 - 比较
t3
和t2
,如果t3
晚于t2
,就认为是超时,返回"Yes"
,否则返回"No"
。
具体步骤
- 将时间字符串转化为分钟数:例如
"18:00"
转化为18 * 60 + 0 = 1080
分钟。 - 判断时间差:计算
t2
和t3
之间的分钟差,若t3
晚于t2
,即时间差大于 0 分钟且不超过 120 分钟(2小时),则输出 "Yes"。 - 否则输出 "No"。
代码实现
def solution(t1: str, t2: str, t3: str) -> str:
def time_to_minutes(t: str) -> int:
hours, minutes = map(int, t.split(":"))
return hours * 60 + minutes
# 将时间 t2 和 t3 转换为分钟数
t2_minutes = time_to_minutes(t2)
t3_minutes = time_to_minutes(t3)
# 如果 t3 比 t2 晚,并且晚的时间不超过2小时,则为超时
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') # 没有超时
代码解释
time_to_minutes
函数:这个函数将时间字符串(如"18:00"
)转换为从00:00开始的分钟数。我们通过split(":")
将字符串分割为小时和分钟,然后转换为整数并计算总分钟数。- 时间差判断:我们将
t2
和t3
转换为分钟数后,计算它们的差。如果t3
在t2
之后且时间差不超过120分钟(即2小时),那么认为是超时,返回"Yes"
,否则返回"No"
。
示例
-
输入:
t1 = "18:00"
,t2 = "19:05"
,t3 = "19:05"
t2
转换为 19:05 -> 1145 分钟t3
转换为 19:05 -> 1145 分钟t3
等于t2
,没有超时,输出"No"
。
-
输入:
t1 = "23:00"
,t2 = "00:21"
,t3 = "00:23"
t2
转换为 00:21 -> 21 分钟t3
转换为 00:23 -> 23 分钟t3
晚于t2
,且时间差为 2 分钟,未超过2小时,输出"Yes"
。
-
输入:
t1 = "23:05"
,t2 = "00:05"
,t3 = "23:58"
t2
转换为 00:05 -> 5 分钟t3
转换为 23:58 -> 1438 分钟t3
在t2
之前,不是超时,输出"No"
。
复杂度分析
- 时间复杂度:O(1),因为我们只需要进行几次字符串解析和简单的数学计算。
- 空间复杂度:O(1),只需要常数级别的空间来存储几个整数。
这样就能够准确判断外卖是否超时了。