某大厂员工吐槽:领导要求写日报,必须精确到每半小时干了啥。结果昨晚停电半小时,我就如实写了,第二天领导问我为什么那半小时没干活?
你可以想象,他为了应付这个要求,按时写下了每个半小时的工作内容。
结果,昨天晚上突发停电半小时,他当然如实写了下来——毕竟停电了,啥也做不了嘛。
可是第二天,领导看到这段时间的空白,直接问他:“为什么这半小时没做活?”
这种事情真的很能体现出一些公司在管理上有多不接地气。我们做程序的,每天的工作不仅仅是盯着屏幕看时间,更多的是解决问题、调整思路。哪能像写流水账一样精确到每半小时?如果你工作的时候时间过得太快,那可能根本没时间注意这些细节。
所以说,领导要求精确到每半小时的工作报告,虽然出发点可能是为了效率和透明度,但真的得理解一下我们这些程序员的工作节奏,免得被无谓的细节给逼疯了【备注:文末可领最新资料】。
算法题:员工空闲时间
题目大概是这样的:给定一组员工的工作时间区间(开始时间和结束时间),如何找出员工的空闲时间?也就是说,哪些时间段是所有员工都没有安排任务的。
一开始我看到这个题目时,心里还挺懵的。你说员工时间重叠的情况还好处理,如果都不重叠呢?那这题的难度就有点像解一道数学题,推导了半天还是没找到正确答案。
我想大概的思路是这样:
将所有员工的工作时间按开始时间排序。 然后从最早的工作时间开始,检查是否与之前的员工时间有重叠。如果没有重叠,就说明有空闲时间。 最终输出所有员工的空闲时间。
看似简单,实际上还是有不少细节需要处理,比如时间的合并,员工时间段的边界问题等。让我们来写一段Java代码看看如何实现。
import java.util.*;class EmployeeFreeTime {
public static class Interval {
int start;
int end;
Interval() { start = 0; end = 0; }
Interval(int s, int e) { start = s; end = e; }
}
public List<Interval> employeeFreeTime(List<List<Interval>> schedule) {
List<Interval> allIntervals = new ArrayList<>();
// 将所有员工的工作时间收集到一个大的列表中
for (List<Interval> intervals : schedule) {
for (Interval interval : intervals) {
allIntervals.add(interval);
}
}
// 按照开始时间排序
Collections.sort(allIntervals, (a, b) -> a.start - b.start);
// 存放空闲时间的结果列表
List<Interval> result = new ArrayList<>();
// 记录前一个工作时间的结束时间
int prevEnd = allIntervals.get(0).end;
for (int i = 1; i < allIntervals.size(); i++) {
Interval current = allIntervals.get(i);
// 如果当前员工的开始时间晚于前一个员工的结束时间,说明存在空闲时间
if (current.start > prevEnd) {
result.add(new Interval(prevEnd, current.start));
}
// 更新前一个结束时间
prevEnd = Math.max(prevEnd, current.end);
}
return result;
}
public static void main(String[] args) {
EmployeeFreeTime solution = new EmployeeFreeTime();
List<List<Interval>> schedule = new ArrayList<>();
List<Interval> employee1 = Arrays.asList(new Interval(1, 2), new Interval(5, 6));
List<Interval> employee2 = Arrays.asList(new Interval(1, 3));
List<Interval> employee3 = Arrays.asList(new Interval(4, 10));
schedule.add(employee1);
schedule.add(employee2);
schedule.add(employee3);
List<Interval> freeTime = solution.employeeFreeTime(schedule);
for (Interval interval : freeTime) {
System.out.println("Free time: [" + interval.start + ", " + interval.end + "]");
}
}
}
上面这段代码,首先将所有员工的时间段合并到一个列表中,然后按开始时间排序。接下来,通过一个循环遍历所有员工的时间段,比较当前时间段是否与上一个时间段有交集。如果没有交集,就说明当前时间段是空闲时间。最后,输出所有空闲时间段。
不过,在实际编写代码时,我们要注意边界条件和一些特殊情况,比如:
如果员工的工作时间全是重叠的,那么空闲时间应该是空的。 如果员工的时间段完全不重叠,那么空闲时间应该是从最早开始到最晚结束之间的所有时间。
其实,这道题的核心就在于对时间的处理,以及如何合并重叠区间。因为大家都知道,程序员的时间大多是和代码重叠的(哈哈)。就像我在这题上卡了半天,重叠时间越多,空闲时间就越少。而实际上,不是所有空闲时间都是可以利用的,毕竟有时候“空闲”时间就是需要停下来休息的时候——这点我觉得,所有的程序员都应该体会过吧?
有的同学可能会觉得这道题只是简单地合并区间,但细节上可能会出一些问题,像时间排序、边界比较等,都会影响最终的答案。
最后,我为大家打造了一份deepseek的入门到精通教程,完全免费:https://www.songshuhezi.com/deepseek
也可以看我写的这篇文章《DeepSeek满血复活,直接起飞!》来进行本地搭建。
-END-
以上,就是今天的分享了,看完文章记得右下角给何老师点赞,也欢迎在评论区写下你的留言。