|
1.问题理解与分析
小C的外卖超时判断
小C点了一份外卖,焦急地等待骑手送来。她想知道她的外卖是否超时了。
已知小C在t1时刻点了外卖,外卖平台显示的预计配送时间为t2,实际配送时间为t3。需要判断外卖是否超时。如果外卖超时,输出“Yes”;否则,输出“No”。
实际送达时间和预计送达时间均在2小时以内。
测试样品
示例1:
输入:t1 =“18:00”,t2 =“19:05”,t3 =“19:05”
输出:“否”
示例2:
输入:t1 =“23:00”,t2 =“00:21”,t3 =“00:23”
输出:“是”
示例3:
输入:t1 =“23:05”,t2 =“00:05”,t3 =“23:58”
输出:“否”
从上面的例子可以看出,有些输入的时间会跨越午夜(比如23:00到00:21),需要特别注意跨越24小时的时间的处理。
2、解题思路和方法
解决这个问题的主要思路就是将时间换算成分钟来进行比较。以下是转换过程中需要考虑的要点:
将时间转换为分钟:将时间 HH:MM 转换为分钟 = 小时 * 60 +。
穿越午夜:如果t2或t3小于t1,则表示时间穿越午夜,需要将其视为第二天的时间。例如,早上00:21可以被视为24:21。
比较实际配送时间和预计配送时间:直接比较换算成分钟的t2和t3。如果t3 > t2,则取出超时。
该解决方案不仅清晰易懂,而且可以轻松处理跨越午夜的情况。
<p><pre> <code class="hljs language-public" lang="public">
// 将时间字符串转换为分钟数
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
}
}
</code></pre></p>
方法:将时间字符串转换为一天中的分钟数。将小时转换为分钟数的 60 倍,然后添加当前分钟数。
方法:计算实际配送时间t3是否超过预计配送时间t2。
• 跨午夜处理:如果预计配送时间t2或实际配送时间t3小于订单时间t1,则认为是次日时间,加24*60换算为次日分钟数。
• 超时判断:比较总和,如果大于总和,则判断超时,返回“Yes”。否则,返回“No”。
4.优化思维
本题通过简单的字符串解析和数学转换完成了任务,但在更复杂的场景下,比如需要多次计算的交互、定时提醒或预估,可能需要更高级的时间管理方法。对于复杂的时间处理,Java 和其他类提供了更灵活的解决方案,例如涉及时区或长日期跨度时。虽然在简单任务中使用这些类稍微有些多余,但在更复杂的场景中性能会非常出色。
五、总结与反思
基本思维的重要性:本题涉及时间换算以及跨半夜特殊情况的处理。对于基本的编程思维来说是一个很好的训练。虽然没有复杂的数据结构或算法,但需要耐心和仔细的逻辑。
代码简洁:在处理时间问题时,通过将时间统一转换为分钟,使代码更加简洁易读。在实际项目中,简洁的代码可以让别人更高效地理解和维护。
未来扩展:如果有更多的需求(比如多时区、日期跨度),可以考虑使用Java类来提高代码的可扩展性和可重用性。
这类时间判断题不仅适用于简单的时间判断,还可以扩展到很多实时监控、报警等场景,提供很多应用价值。 |
|