程序员老鬼

某大厂员工吐槽:领导要求写日报,必须精确到每半小时干了啥。结果昨晚停电半小时,我就如实写了,第二天领导问我为什么那半小时没干活?

昨天和一个同行聊天,他跟我吐槽了一个特别有意思的事情,简直让我笑出了声。他说公司要求每天提交日报,而且必须精确到每半小时做了什么。

Image

你可以想象,他为了应付这个要求,按时写下了每个半小时的工作内容。

结果,昨天晚上突发停电半小时,他当然如实写了下来——毕竟停电了,啥也做不了嘛。

可是第二天,领导看到这段时间的空白,直接问他:“为什么这半小时没做活?”

这种事情真的很能体现出一些公司在管理上有多不接地气。我们做程序的,每天的工作不仅仅是盯着屏幕看时间,更多的是解决问题、调整思路。哪能像写流水账一样精确到每半小时?如果你工作的时候时间过得太快,那可能根本没时间注意这些细节。

所以说,领导要求精确到每半小时的工作报告,虽然出发点可能是为了效率和透明度,但真的得理解一下我们这些程序员的工作节奏,免得被无谓的细节给逼疯了【备注:文末可领最新资料】。

算法题:员工空闲时间

最近刷题的时候,遇到一个有意思的算法题,想跟大家分享一下。

题目大概是这样的:给定一组员工的工作时间区间(开始时间和结束时间),如何找出员工的空闲时间?也就是说,哪些时间段是所有员工都没有安排任务的。

一开始我看到这个题目时,心里还挺懵的。你说员工时间重叠的情况还好处理,如果都不重叠呢?那这题的难度就有点像解一道数学题,推导了半天还是没找到正确答案。

我想大概的思路是这样:

  1. 将所有员工的工作时间按开始时间排序。
  2. 然后从最早的工作时间开始,检查是否与之前的员工时间有重叠。如果没有重叠,就说明有空闲时间。
  3. 最终输出所有员工的空闲时间。

看似简单,实际上还是有不少细节需要处理,比如时间的合并,员工时间段的边界问题等。让我们来写一段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-

ok,今天先说到这,老规矩,给大家分享一份不错的副业资料,感兴趣的同学找我领取。

图片

以上,就是今天的分享了,看完文章记得右下角给何老师点赞,也欢迎在评论区写下你的留言。