今天分享一道我个人认为非常有意思的题目与思路分析:是题库中的“外卖超时判断”。
问题描述
小C点了一个外卖,并且急切地等待着骑手的送达。她想知道她的外卖是否超时了。已知小C在时刻 t1 点了外卖,外卖平台上显示的预计送达时间为 t2,而实际送达时间为 t3。需要判断外卖是否超时。如果外卖超时,则输出 "Yes";否则输出 "No"。如果 t3 在 t2 之后则认定为超时。
解题思路
- 解析时间:使用
LocalTime和DateTimeFormatter解析输入的时间字符串t1、t2和t3。 - 计算时间差:计算预计送达时间
t2和实际送达时间t3之间的分钟差。 - 判断超时:如果实际送达时间晚于预计送达时间,并且时间差在2小时之内,则判断为超时。
实现代码
以下是实现这一思路的Java代码:
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
public class Main {
public static String solution(String t1, String t2, String t3) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm");
LocalTime timeOrdered = LocalTime.parse(t1, formatter);
LocalTime timeEstimated = LocalTime.parse(t2, formatter);
LocalTime timeDelivered = LocalTime.parse(t3, formatter);
// 计算预计送达时间和实际送达时间之间的差异
long minutesDifference = ChronoUnit.MINUTES.between(timeEstimated, timeDelivered);
// 如果实际送达时间晚于预计送达时间,则判断为超时
if (minutesDifference > 0 && minutesDifference < 120) {
return "Yes";
} else {
return "No";
}
}
public static void main(String[] args) {
System.out.println(solution("18:00", "19:05", "19:05").equals("No"));
System.out.println(solution("23:00", "00:21", "00:23").equals("Yes"));
System.out.println(solution("23:05", "00:05", "23:58").equals("No"));
}
}
算法步骤
- 初始化时间格式:创建一个
DateTimeFormatter对象来解析时间字符串。 - 解析时间:将字符串
t1、t2和t3解析为LocalTime对象。 - 计算时间差:使用
ChronoUnit.MINUTES.between方法计算t2和t3之间的分钟差。 - 判断超时:根据时间差判断是否超时,并返回相应的字符串。
时间复杂度
- 解析时间字符串的时间复杂度为 O(1)。
- 计算时间差的时间复杂度为 O(1)。
- 总的时间复杂度为 O(1)。
空间复杂度
- 使用了常数级的额外空间,因此空间复杂度为 O(1)。
学习心得
通过实现这个外卖超时判断功能,我学习了如何使用Java的 LocalTime 和 DateTimeFormatter 类来处理时间相关的操作。这个问题的解决过程强调了时间解析、时间差计算以及条件判断的重要性。在未来的编程实践中,我将应用这些技巧来处理更多涉及时间操作和逻辑判断的场景。