豆包MarsCode AI刷题 | 外卖超时判断题目解析与实践
在当今快节奏的生活中,外卖已成为许多人日常饮食的重要组成部分。而在点外卖的过程中,外卖是否能按时送达无疑是用户非常关心的问题。本次我们将深入剖析一道关于判断外卖是否超时的编程题目,并通过代码实现和具体实例展示解题过程。
问题描述
小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"
解题思路
在这道题目中,时间跨越夜间会是一个需要特殊处理的情况。并且为方便比较,需要将时间转换为分钟形式,这样可以避免处理复杂的字符串比较。
具体步骤
- 时间转换:将时间转换为分钟数。例如:
"18:00"转换为18*60 + 0 = 1080分钟。 - 跨越夜间处理:如果预计送达时间
t2比下单时间t1小,说明t2跨越了午夜,需要增加24小时的分钟数。同样,对于实际送达时间t3也需要这样的处理。 - 时间比较:在分钟数统一处理后,将实际送达时间
t3与预计送达时间t2进行比较,如果t3大于t2则超时,否则未超时。
转换函数分析
为了便于处理时间,我们需要一个辅助函数将时间 HH:MM 转换为分钟数。
def time_to_minutes(t):
h, m = map(int, t.split(':'))
return h * 60 + m
该函数将输入的时间字符串拆分为小时和分钟部分,并转换成总分钟数返回。
时间转换和比较过程
我们将时间 t1, t2 和 t3 分别转换为分钟数,并根据跨夜的情况进行调整:
def solution(t1: str, t2: str, t3: str) -> str:
# 辅助函数:将时间转换为分钟数
def time_to_minutes(t):
h, m = map(int, t.split(':'))
return h * 60 + m
# 将时间转换为分钟数
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
# 处理实际送达时间跨夜的情况
if t3_minutes < t1_minutes:
t3_minutes += 24 * 60
# 比较实际送达时间和预计送达时间
if t3_minutes > t2_minutes:
return "Yes"
else:
return "No"
代码解析与详解
我们将上述步骤整合到完整的Python函数中,并添加测试用例进行验证。
代码实现
def solution(t1: str, t2: str, t3: str) -> str:
# 辅助函数:将时间转换为分钟数
def time_to_minutes(t):
h, m = map(int, t.split(':'))
return h * 60 + m
# 将时间转换为分钟数
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
# 处理实际送达时间跨夜的情况
if t3_minutes < t1_minutes:
t3_minutes += 24 * 60
# 比较实际送达时间和预计送达时间
if t3_minutes > t2_minutes:
return "Yes"
else:
return "No"
# 测试用例
if __name__ == '__main__':
print(solution("18:00", "19:05", "19:05") == 'No') # 输出 "No"
print(solution("23:00", "00:21", "00:23") == 'Yes') # 输出 "Yes"
print(solution("23:05", "00:05", "23:58") == 'No') # 输出 "No"
测试用例分析
测试用例1:
- 输入:
t1 = "18:00",t2 = "19:05",t3 = "19:05" - 分析:
t1是18:00,t2和t3都是19:05。转换为分钟数后分别为1080,1145,1145。t3等于t2,因此不超时。 - 输出:"No"
测试用例2:
- 输入:
t1 = "23:00",t2 = "00:21",t3 = "00:23" - 分析:
t1是23:00,t2是00:21,t3是00:23。转换为分钟数后分别为23*60 = 1380,21,23。需要处理跨夜情况,转换为1380,1441,1443。t3大于t2,因此超时。 - 输出:"Yes"
测试用例3:
- 输入:
t1 = "23:05",t2 = "00:05",t3 = "23:58" - 分析:
t1是23:05,t2是00:05,t3是23:58。转换为分钟数后分别为23*60 + 5 = 1385,5,23*60 + 58 = 1438。需要处理跨夜情况,转换为1385,1445,1438。t3小于t2,因此不超时。 - 输出:"No"
学习方法与心得
在这次解题过程中,我不仅解决了一个实际的算法问题,还提升了时间处理和跨夜情况的处理技巧。以下是我在这次学习中的一些方法与心得:
1. 理解问题背景
首先要理解问题的背景和需求,这很重要。通过理解实际场景,更容易找到解决问题的思路。例如,这道题目中的时间比较和跨夜处理就是一个需要深入理解的点。
2. 分解问题
将复杂的问题分解为几个简单的小问题,通过多个小问题的解决来完成整个问题的求解。比如,本题中将时间转换为分钟数就是一个重要的步骤,通过分钟数比较可以大大简化问题。
3. 辅助函数的使用
在编程中,善于使用辅助函数可以让代码更加简洁和模块化。例如在本题中,通过 time_to_minutes 辅助函数,我们将时间转换为分钟数,方便了后续的处理和比较。
4. 充分测试
编写多个测试用例来验证代码的正确性,不同的时间组合和跨夜情况都是需要测试的重点。通过充分的测试,可以确保代码在各种情况下都能正确运行。
5. 不断总结和反思
在每次解决问题后,进行总结和反思,看是否有更优的解法或者哪些地方可以改进。通过总结经验和教训,不断提升自己的编程水平。
结语
通过这道题目的解析与实践,我们不仅学会