JAVA 1.传入工作时间段字符串 格式为HH:mm-HH:mm;HH:mm-HH:mm;... 2.传入空闲时间段字符串 格式为HH:mm-HH:mm;HH:mm-HH:mmHH:mm-HH:mm;HH:mm-HH:mm; 3.判断空闲时间段能不能连续上到最后的下班时间 如果能 返回时间 连续是指包含休息时间在内的多个工作时段如果是连续的就算连续
时间: 2024-02-23 09:59:34 浏览: 84
好的,我来解答你的问题。
首先,我们需要将传入的工作时间段字符串和空闲时间段字符串解析成时间段的列表。可以定义一个函数来完成这个解析过程,如下所示:
```java
public List<TimeRange> parseTimeRanges(String timeString) {
List<TimeRange> timeRanges = new ArrayList<>();
String[] ranges = timeString.split(";");
for (String range : ranges) {
String[] parts = range.split("-");
TimeRange timeRange = new TimeRange(parseTime(parts[0]), parseTime(parts[1]));
timeRanges.add(timeRange);
}
return timeRanges;
}
public LocalTime parseTime(String timeString) {
String[] parts = timeString.split(":");
int hour = Integer.parseInt(parts[0]);
int minute = Integer.parseInt(parts[1]);
return LocalTime.of(hour, minute);
}
```
其中,TimeRange 是一个表示时间段的类,包含开始时间和结束时间。我们还需要定义一个函数来判断两个时间段是否相邻,如下所示:
```java
public boolean isAdjacent(TimeRange range1, TimeRange range2) {
return range1.getEnd().equals(range2.getStart()) || range2.getEnd().equals(range1.getStart());
}
```
接下来,我们可以用深度优先搜索来找到能够连续上到最后的下班时间。搜索过程中,我们需要维护当前时间、当前是否在工作时间段中、当前是否在空闲时间段中、已经选定的空闲时间段的结束时间等状态。搜索过程中,我们可以尝试在当前空闲时间段中选取一个时间段,然后判断是否能够和当前时间相邻。如果能够相邻,就将当前时间更新为该空闲时间段的结束时间,并继续搜索。如果不能相邻,就回溯到上一个状态,尝试其他的空闲时间段。
搜索的过程可以用递归函数来实现,如下所示:
```java
public LocalTime findEndTime(List<TimeRange> workRanges, List<TimeRange> freeRanges) {
LocalTime endTime = LocalTime.MIDNIGHT;
boolean inWorkRange = false;
boolean inFreeRange = false;
LocalTime freeEndTime = null;
search(endTime, inWorkRange, inFreeRange, freeEndTime, workRanges, freeRanges);
return endTime;
}
public void search(LocalTime currentTime, boolean inWorkRange, boolean inFreeRange, LocalTime freeEndTime,
List<TimeRange> workRanges, List<TimeRange> freeRanges) {
if (currentTime.compareTo(LocalTime.of(18, 0)) >= 0) {
// 找到了符合要求的下班时间
endTime = currentTime;
return;
}
// 在当前时间点,可以选择的空闲时间段
List<TimeRange> availableRanges = freeRanges.stream()
.filter(range -> range.getStart().compareTo(currentTime) <= 0)
.filter(range -> !range.getEnd().isBefore(freeEndTime))
.collect(Collectors.toList());
// 尝试选择每个空闲时间段
for (TimeRange range : availableRanges) {
if (!inFreeRange) {
// 进入空闲时间段
inFreeRange = true;
freeEndTime = range.getEnd();
search(freeEndTime, inWorkRange, inFreeRange, freeEndTime, workRanges, freeRanges);
inFreeRange = false;
} else if (isAdjacent(new TimeRange(currentTime, freeEndTime), range)) {
// 选择当前空闲时间段
freeEndTime = range.getEnd();
search(freeEndTime, inWorkRange, inFreeRange, freeEndTime, workRanges, freeRanges);
}
}
// 尝试进入每个工作时间段
for (TimeRange range : workRanges) {
if (!inWorkRange && isAdjacent(new TimeRange(currentTime, freeEndTime), range)) {
// 进入工作时间段
inWorkRange = true;
search(range.getEnd(), inWorkRange, inFreeRange, freeEndTime, workRanges, freeRanges);
inWorkRange = false;
}
}
}
```
最后,我们可以将这些函数组合起来,完成我们的任务:
```java
String workTime = "08:30-12:00;13:00-17:30";
String freeTime = "12:00-13:00;17:30-18:00";
List<TimeRange> workRanges = parseTimeRanges(workTime);
List<TimeRange> freeRanges = parseTimeRanges(freeTime);
LocalTime endTime = findEndTime(workRanges, freeRanges);
System.out.println(endTime);
```
以上就是完整的解答,希望能对你有所帮助!
阅读全文