青训/简单:小C的外卖超时判断
文章目录
问题描述
小C点了一个外卖,并且急切地等待着骑手的送达。她想知道她的外卖是否超时了。
已知小C在时刻 `t1` 点了外卖,外卖平台上显示的预计送达时间为 `t2`,而实际送达时间为 `t3`。需要判断外卖是否超时。如果外卖超时,则输出 `"Yes"`;否则输出 `"No"`。
实际送达时间与预计送达时间在 `2` 小时之内。
 
测试样例
示例 1:
示例 2:
示例 3:
示例
def solution(t1: str, t2: str, t3: str) -> str:
    # write code here
    pass
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')
 
思路:
直接判断T3>T2 也就是实际送达大于预计送达,就是超时
实际处理:需要注意跨天的情况
答案
def solution(t1: str, t2: str, t3: str) -> str:
    # 将时间转换为分钟数
    def time_to_minutes(t):
        hours, minutes = map(int, t.split(':'))
        return hours * 60 + minutes
    
    # 转换所有时间为分钟
    t1_min = time_to_minutes(t1)
    t2_min = time_to_minutes(t2)
    t3_min = time_to_minutes(t3)
    
    # 处理跨天的情况
    # 如果预计送达时间小于下单时间,说明跨天了
    if t2_min < t1_min:
        t2_min += 24 * 60  # 加24小时的分钟数
    
    # 如果实际送达时间小于下单时间,说明跨天了
    if t3_min < t1_min:
        t3_min += 24 * 60
    
    # 判断是否超时
    return "Yes" if t3_min > t2_min 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')
 
python补充知识
实际上,我用Java作为主要语言,python是本次训练时候新使用的语言,因此python方法不熟悉,故做以下补充,日常复习
1、hours, minutes = map(int, t.split(‘:’)) 是啥意思->map指最后结果为int,而根据t的数字个数,对应赋值给前面的变量,例如t的第一位赋给hours,第二赋给minutes
-  
t.split(':')的作用是将时间字符串用冒号分割:
- 比如 “18:00” 会被分割成 [“18”, “00”]
 - “19:05” 会被分割成 [“19”, “05”]
 
 -  
map(int, split_result)的作用是将分割后的字符串转换为整数:
- [“18”, “00”] 变成 [18, 0]
 - [“19”, “05”] 变成 [19, 5]
 
 -  
hours, minutes =是将转换后的两个数字分别赋值给 hours 和 minutes 变量 
运行这个代码,你会看到详细的处理过程。比如对于第一个测试用例 “18:00”:
- 先被分割成 [“18”, “00”]
 - 然后转换成整数 18 和 0
 - 最后计算总分钟数 18 * 60 + 0 = 1080
 
2、接上,map 那如果t位数大于2,而没有变量承接,是否会报错?是的,会报错,因此处理如下方。
1 变量解包的规则:
- 如果变量数量和值的数量不匹配,会报 ValueError
 - 变量太多会报错:
not enough values to unpack - 值太多也会报错:
too many values to unpack 
2 处理多余值的方法:
-  
可以使用
*变量名来接收多余的值,它会把多余的值放在一个列表中 -  
例如:
h3, m3, *rest = map(int, "18:05:30:45".split(':')) -  
结果:
h3=18, m3=5, rest=[30, 45] 
3、如何预先处理,未知map内部t的位数?如下①确保处理格式 ②无法的值具体位数,则用*rest接收多余值 ③仅取需要的部分,map后,使用list转换并取list的[0:2] 0到2位。
要处理这种情况,有几种方案:
- 确保输入数据格式正确
 - 使用 
*rest接收多余的值 - 只取需要的部分,例如:
hours, minutes = list(map(int, t.split(':')))[0:2] 
4、打印示例如下
# 测试1:正常情况 - 两个值对应两个变量
print("=== 测试1:正常情况 ===")
t = "18:05"
print(f"原始字符串: {t}")
print(f"split后: {t.split(':')}")  # ['18', '05']
print(f"map后(转换为list查看): {list(map(int, t.split(':')))}")  # [18, 5]
hours, minutes = map(int, t.split(':'))
print(f"解包后 - hours: {hours}, minutes: {minutes}")  # hours: 18, minutes: 5
# 测试2:值的数量少于变量数量
print("\n=== 测试2:值少于变量 ===")
try:
    t = "18"  # 只有一个值
    print(f"原始字符串: {t}")
    print(f"split后: {t.split(':')}")
    h1, m1 = map(int, t.split(':'))
except ValueError as e:
    print(f"错误信息: {e}")
# 测试3:值的数量多于变量数量
print("\n=== 测试3:值多于变量 ===")
try:
    t = "18:05:30"  # 三个值
    print(f"原始字符串: {t}")
    print(f"split后: {t.split(':')}")
    print(f"map后(转换为list查看): {list(map(int, t.split(':')))}")
    h2, m2 = map(int, t.split(':'))
except ValueError as e:
    print(f"错误信息: {e}")
# 测试4:使用*接收多余的值
print("\n=== 测试4:使用*接收多余的值 ===")
t = "18:05:30:45"
print(f"原始字符串: {t}")
print(f"split后: {t.split(':')}")
print(f"map后(转换为list查看): {list(map(int, t.split(':')))}")
h3, m3, *rest = map(int, t.split(':'))
print(f"解包后 - hours: {h3}, minutes: {m3}, 剩余值: {rest}")










