题目解析与学习总结:外卖超时判断问题
一、题目解析
本题涉及时间字符串的处理,要求判断外卖是否超时,思路清晰且逻辑较为简单,但需要注意跨天处理和时间比较的细节。具体题目描述如下:
小C在某时刻 t1t1 点了外卖,外卖平台显示预计送达时间为 t2t2,实际送达时间为 t3t3。如果实际送达时间 t3t3 晚于预计送达时间 t2t2,则判定超时,输出 "Yes";否则输出 "No"。
二、解题思路
-
时间字符串转换为分钟数
- 采用函数
time_to_minutes
,将形如hh:mm
的时间字符串转换为分钟数,方便进行数值比较。例如18:00
转换为 18×60+0=108018 \times 60 + 0 = 1080 分钟。
- 采用函数
-
跨天处理
- 如果 t2t2 或 t3t3 比 t1t1 小,说明时间跨越了一天,需要在其基础上加 1440 分钟(24 小时),确保时间比较逻辑正确。
-
时间比较
- 转换完成后,直接比较 t3t3 是否大于 t2t2。若超时则返回 "Yes",否则返回 "No"。
三、代码实现与详解
def solution(t1: str, t2: str, t3: str) -> str:
# 时间字符串转为分钟数
def time_to_minutes(time: str) -> int:
hours, minutes = map(int, time.split(":"))
return hours * 60 + minutes
# 转换时间为分钟数
t1_minutes = time_to_minutes(t1)
t2_minutes = time_to_minutes(t2)
t3_minutes = time_to_minutes(t3)
# 跨天处理:如果 t2 或 t3 比 t1 小,说明跨天
if t2_minutes < t1_minutes:
t2_minutes += 1440
if t3_minutes < t1_minutes:
t3_minutes += 1440
# 比较 t3 和 t2 的分钟值
return "Yes" if t3_minutes > t2_minutes else "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
函数:- 时间字符串通过
split
分割为小时和分钟,按公式计算总分钟数。
- 时间字符串通过
-
跨天处理:
- 判断 t2t2 和 t3t3 是否比 t1t1 小,若是,则说明时间跨天,需加 1440 分钟。
-
超时判断:
- 通过 t3t3 和 t2t2 的大小直接得出结论。
四、知识总结
-
时间字符串处理
- 将时间转化为分钟数是一种常见技巧,可在时间比较、计算时避免复杂的逻辑。
- 跨天问题需特别注意,关键是理解次日的时间如何表达并进行修正。
-
跨天逻辑
- 如果某时间点比基准时间点小,则说明发生了跨天,例如 23:0023:00 到 00:0500:05。
-
模块化思维
- 将常见逻辑独立封装为函数,如
time_to_minutes
,提高代码复用性和可读性。
- 将常见逻辑独立封装为函数,如
五、学习建议与计划
高效刷题方法:
- 分解问题:将问题分成若干子问题(如时间转换、跨天处理),逐一解决。
- 错误分析:对于错误用例,明确问题所在(如时间跨天处理遗漏),并优化代码逻辑。
- 总结规律:通过类似问题的总结,提炼通用解题思路(如时间转换的技巧)。
利用错题库:
- 每次刷题后,将未通过的用例和错误原因记录,定期复盘。
- 通过 MarsCode AI 的智能反馈功能,分析错误的核心原因,针对性复习。
工具与资源结合:
- MarsCode AI + LeetCode:结合题目解析与代码运行,练习不同题型。
- 时间管理与计划:每日定量刷题(如 3-5 道),每周固定总结所学知识点。
六、总结与建议
通过 MarsCode AI 刷题工具,可以将时间字符串处理类问题中的复杂逻辑逐一分解。针对入门同学,建议从简单问题入手,注重思路梳理和代码优化,不断提升算法思维。同时,善用工具如错题反馈与 AI 解析,结合规律总结和针对性训练,逐步提升编程能力和解题水平。