一、题目理解与分析
小C的外卖超时判断
小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"
从上述示例可以看出,某些输入中时间会跨越午夜(如 23:00 到 00:21),需要特别注意跨越24小时的时间处理。
二、解题思路与方法
为了解决该问题,主要思路是将时间转换为分钟数进行比较。在转换过程中要考虑以下关键点:
-
时间转分钟数:将时间 HH:MM 转换为分钟数 totalMinutes = hours * 60 + minutes。
-
跨越午夜的情况:如果 t2 或 t3 比 t1 小,说明时间跨越了午夜,需将其视为次日的时间,例如凌晨 00:21 可以看作是 24:21。
-
比较实际送达时间和预计送达时间:通过转换为分钟数的 t2 和 t3 直接比较,若 t3 > t2,则外卖超时。
这种方案不仅清晰、易于理解,还能轻松处理跨越午夜的时间情况。
// 将时间字符串转换为分钟数
private static int timeToMinutes(String time) {
String[] parts = time.split(":");
int hours = Integer.parseInt(parts[0]);
int minutes = Integer.parseInt(parts[1]);
return hours * 60 + minutes;
}
public static String isDeliveryLate(String t1, String t2, String t3) {
int startTime = timeToMinutes(t1);
int estimatedTime = timeToMinutes(t2);
int actualTime = timeToMinutes(t3);
// 如果预计送达时间跨过午夜,调整分钟数
if (estimatedTime < startTime) {
estimatedTime += 24 * 60; // 把预计时间视为次日的时间
}
// 同样,如果实际送达时间跨过午夜,调整分钟数
if (actualTime < startTime) {
actualTime += 24 * 60; // 把实际时间视为次日的时间
}
// 判断是否超时
return actualTime > estimatedTime ? "Yes" : "No";
}
public static void main(String[] args) {
// 测试示例
System.out.println(isDeliveryLate("18:00", "19:05", "19:05")); // 输出: No
System.out.println(isDeliveryLate("23:00", "00:21", "00:23")); // 输出: Yes
System.out.println(isDeliveryLate("23:05", "00:05", "23:58")); // 输出: No
}
}
-
timeToMinutes 方法:将时间字符串转换为当天的分钟数。小时转化为60倍的分钟数后加上当前的分钟数。
-
isDeliveryLate 方法:计算实际送达时间 t3 是否超过预计送达时间 t2。
• 跨越午夜处理:如果预计送达时间 t2 或实际送达时间 t3 小于下单时间 t1,则认为其为次日的时间,通过加 24*60 来将其转换为次日时间的分钟表示。
• 判断超时:比较 actualTime 和 estimatedTime,若 actualTime 大于 estimatedTime,则判断为超时,返回 "Yes";否则返回 "No"。
四、优化思考
这道题通过简单的字符串解析和数学转换完成了任务,但是在更复杂的场景中,比如需要计算多个时间的交互、定时提醒或预估,或许需要更高级的时间管理方式。对于复杂时间的处理,Java的 LocalTime、LocalDateTime 等类提供了更为灵活的解决方案,例如在涉及时区或日期跨度较长的情况下。使用这些类虽然在简单任务中略显冗余,但在更复杂场景下的表现会非常出色。
五、总结与反思
-
基础思维的重要性:这道题目涉及时间转换与跨越午夜的特殊情况处理,是对基础编程思维的良好训练。虽然没有复杂的数据结构或算法,但需要耐心和细致的逻辑。
-
代码简洁性:在处理时间问题时,通过将时间统一转换为分钟数,使代码更为简洁和可读。在实际项目中,简洁的代码可以更高效地被他人理解和维护。
-
未来拓展:如果有更多需求(如多时区、日期跨度),可以考虑使用Java的 LocalTime 等类,以提高代码的扩展性和复用性。
此类时间判断题目不仅仅适用于简单的时刻判断,还可以拓展到很多实时监控、报警等场景,提供了诸多应用价值。