小C的外卖超时判断 | 豆包MarsCode AI刷题

84 阅读6分钟

豆包MarsCode AI刷题 | 外卖超时判断题目解析与实践

在当今快节奏的生活中,外卖已成为许多人日常饮食的重要组成部分。而在点外卖的过程中,外卖是否能按时送达无疑是用户非常关心的问题。本次我们将深入剖析一道关于判断外卖是否超时的编程题目,并通过代码实现和具体实例展示解题过程。

问题描述

小C点了一个外卖,并且急切地等待着骑手的送达。她想知道她的外卖是否超时。已知小C在时刻 t1 点了外卖,外卖平台上显示的预计送达时间为 t2,而实际送达时间为 t3。需要判断外卖是否超时。如果外卖超时,则输出 "Yes";否则输出 "No"。t3t2 之后则认定为超时。

实际送达时间与预计送达时间在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"

解题思路

在这道题目中,时间跨越夜间会是一个需要特殊处理的情况。并且为方便比较,需要将时间转换为分钟形式,这样可以避免处理复杂的字符串比较。

具体步骤

  1. 时间转换:将时间转换为分钟数。例如:"18:00" 转换为 18*60 + 0 = 1080 分钟。
  2. 跨越夜间处理:如果预计送达时间 t2 比下单时间 t1 小,说明 t2 跨越了午夜,需要增加24小时的分钟数。同样,对于实际送达时间 t3 也需要这样的处理。
  3. 时间比较:在分钟数统一处理后,将实际送达时间 t3 与预计送达时间 t2 进行比较,如果 t3 大于 t2 则超时,否则未超时。

转换函数分析

为了便于处理时间,我们需要一个辅助函数将时间 HH:MM 转换为分钟数。

def time_to_minutes(t):
    h, m = map(int, t.split(':'))
    return h * 60 + m

该函数将输入的时间字符串拆分为小时和分钟部分,并转换成总分钟数返回。

时间转换和比较过程

我们将时间 t1, t2t3 分别转换为分钟数,并根据跨夜的情况进行调整:

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,t2t3 都是19:05。转换为分钟数后分别为 1080, 1145, 1145t3 等于 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, 1443t3 大于 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, 1438t3 小于 t2,因此不超时。
  • 输出:"No"

学习方法与心得

在这次解题过程中,我不仅解决了一个实际的算法问题,还提升了时间处理和跨夜情况的处理技巧。以下是我在这次学习中的一些方法与心得:

1. 理解问题背景

首先要理解问题的背景和需求,这很重要。通过理解实际场景,更容易找到解决问题的思路。例如,这道题目中的时间比较和跨夜处理就是一个需要深入理解的点。

2. 分解问题

将复杂的问题分解为几个简单的小问题,通过多个小问题的解决来完成整个问题的求解。比如,本题中将时间转换为分钟数就是一个重要的步骤,通过分钟数比较可以大大简化问题。

3. 辅助函数的使用

在编程中,善于使用辅助函数可以让代码更加简洁和模块化。例如在本题中,通过 time_to_minutes 辅助函数,我们将时间转换为分钟数,方便了后续的处理和比较。

4. 充分测试

编写多个测试用例来验证代码的正确性,不同的时间组合和跨夜情况都是需要测试的重点。通过充分的测试,可以确保代码在各种情况下都能正确运行。

5. 不断总结和反思

在每次解决问题后,进行总结和反思,看是否有更优的解法或者哪些地方可以改进。通过总结经验和教训,不断提升自己的编程水平。

结语

通过这道题目的解析与实践,我们不仅学会