青训/简单:小C的外卖超时判断
文章目录
- 青训/简单:小C的外卖超时判断
- 问题描述
- 测试样例
- 示例
- 思路:
- 答案
- python补充知识
- 1、hours, minutes = map(int, t.split(':')) 是啥意思->map指最后结果为int,而根据t的数字个数,对应赋值给前面的变量,例如t的第一位赋给hours,第二赋给minutes
- 2、接上,map 那如果t位数大于2,而没有变量承接,是否会报错?是的,会报错,因此处理如下方。
- 3、如何预先处理,未知map内部t的位数?如下①确保处理格式 ②无法的值具体位数,则用*rest接收多余值 ③仅取需要的部分,map后,使用list转换并取list的[0:2] 0到2位。
- 4、打印示例如下
问题描述
小C点了一个外卖,并且急切地等待着骑手的送达。她想知道她的外卖是否超时了。
已知小C在时刻 `t1` 点了外卖,外卖平台上显示的预计送达时间为 `t2`,而实际送达时间为 `t3`。需要判断外卖是否超时。如果外卖超时,则输出 `"Yes"`;否则输出 `"No"`。
实际送达时间与预计送达时间在 `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 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}")