问题描述
小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"
解答代码
def time_to_minutes(time: str) -> int:
"""将时间字符串转换为从午夜起的分钟数"""
hours, minutes = map(int, time.split(':'))
return hours * 60 + minutes
def solution(t1: str, t2: str, t3: str) -> str:
# 将时间字符串转换为分钟
t1_minutes = time_to_minutes(t1)
t2_minutes = time_to_minutes(t2)
t3_minutes = time_to_minutes(t3)
# 处理跨天的情况
if t2_minutes < t1_minutes:
t2_minutes += 24 * 60 # 如果预计时间在t1的前面,增加一天的分钟数
if t3_minutes < t1_minutes:
t3_minutes += 24 * 60 # 如果实际送达时间在t1的前面,增加一天的分钟数
# 判断是否超时
if t3_minutes > t2_minutes:
return "Yes"
else:
return "No"
if name == 'main':
print(solution("18:00", "19:05", "19:05") == 'No') # 输出: True
print(solution("23:00", "00:21", "00:23") == 'Yes') # 输出: True
print(solution("23:05", "00:05", "23:58") == 'No') # 输出: True
思路
时间转换函数:
- `time_to_minutes(time: str) -> int`:这个函数接收一个时间字符串(格式为`HH:MM`),将其拆分为小时和分钟,然后将小时转换为分钟(乘以60),并与分钟相加,得到从午夜(00:00)起算的总分钟数。
主函数:
- `solution(t1: str, t2: str, t3: str) -> str`:这个函数接收三个时间字符串,分别代表开始时间(`t1`)、预计结束时间(`t2`)和实际送达时间(`t3`)。
- 首先,使用`time_to_minutes`函数将这三个时间转换为从午夜起的分钟数。
- 接下来,处理跨天的情况。如果预计结束时间(`t2`)或实际送达时间(`t3`)在开始时间(`t1`)之前,说明这些时间是跨天的。为了处理这种情况,给这些时间加上一天的分钟数(`24 * 60`)。
- 最后,比较实际送达时间(`t3`)和预计结束时间(`t2`)。如果`t3`大于`t2`,说明超时了,返回"Yes";否则,没有超时,返回"No"。
测试:
- 在`if __name__ == '__main__':`块中,通过几个测试用例来验证`solution`函数的正确性。这些测试用例包括不超时的情况(第一个和第三个测试)和超时的情况(第二个测试),以及跨天的情况(第二个和第三个测试,尽管第三个测试没有超时,但它仍然涉及到跨天时间的比较)。