程序员老鬼

某HR吐槽:面试了不下千人,我最反感求职者面试时一直追问说这个岗位是干什么的,这只会暴露你的不重视、无知,毫无自主思考性

刚看到个贴子,说有HR抱怨:面试了上千人,最讨厌候选人反复追问“这个岗位到底是干什么的”,觉得这是轻视和没准备的表现。

Image

我觉得这事吧,换位思考一下,HR的点也没错。毕竟岗位信息写在JD上,如果面试时还一问三不知,确实会让人怀疑你的用心程度。网友们也有人觉得候选人只是想确认实际工作内容,避免信息差,但过度追问反而可能让人觉得不独立思考。

从我的角度看,面试前做足功课是基本功,就像你去超市买东西,起码得看清楚标签;但同时,候选人也有权利通过一两个关键问题确认真实职责,防止“货不对板”。关键差别就在于,你是有准备地问,还是无准备地追问。

面试就像双向选择,尊重和专业是底线。带着功课去提问,才更容易赢得尊重,也更显得靠谱。【备注:文末可领最新资料】

算法题:查找超预订员工

小题先交代下背景啊——昨天晚上十一点多,在公司楼下抽烟,隔壁组小李又在喊:“谁把我排班给排穿了?我一天三场会?!”我当时困得眼冒金星,但这事儿我太熟了,典型的“超预订员工”检测,排会、排工单、排门店班次都一个路子。就是那个…怎么说呢…我们要在一堆时间段里,找出被安排得重叠、超过承载上限(有的人一天最多带K个单)的员工,对吧。

输入是一堆记录:员工id、开始时间、结束时间。半开区间 [start, end),这样 end==下一段的 start 不算冲突。每个员工还可以有一个“容量上限”K,比如新人K=1,资深K=2。我们要把所有“在某一时刻并发安排数 > K”的员工找出来。嗯就这意思。

说白了就是“扫描线”。把同一员工的所有时间段拆成事件:start记+1,end记-1,按时间排序,时间相同让-1在前(避免尾接头误判)。从头累加,一旦并发数>该员工K,这人就超预订了。为啥逐人?因为跨人之间互不影响,能并行也能分散内存。复杂度嘛,排序是主耗时,O(N log N)。

1)时间戳别用字符串比较,转成long或分钟数;2)脏数据(end<=start)直接丢或修正;3)没配K的默认给1;4)区间定义半开,不然边界会很烦人…唉,别问我怎么知道的,血泪史。

import java.util.*;

publicclassOverbookedDetector{

staticclassBooking{
        String empId;
long start; // 建议用epoch分钟
long end;
        Booking(String e, long s, long t) { this.empId = e; this.start = s; this.end = t; }
    }

publicstatic Set<String> findOverbookedEmployees(List<Booking> bookings,
                                                      Map<String, Integer> capacityByEmp)
{
        Map<String, List<long[]>> events = new HashMap<>();
for (Booking b : bookings) {
if (b.end <= b.start) continue; // 脏数据跳过
            events.computeIfAbsent(b.empId, k -> new ArrayList<>())
                  .add(newlong[]{b.start, +1});
            events.get(b.empId).add(newlong[]{b.end, -1}); // 半开区间
        }
        Set<String> bad = new HashSet<>();
for (Map.Entry<String, List<long[]>> e : events.entrySet()) {
            String emp = e.getKey();
int cap = capacityByEmp.getOrDefault(emp, 1);
            List<long[]> es = e.getValue();
            es.sort((a, b) -> {
if (a[0] != b[0]) return Long.compare(a[0], b[0]);
// 同时刻,先-1再+1,避免 end==start 被算重叠
return Integer.compare((int)a[1], (int)b[1]);
            });
int cur = 0;
for (long[] ev : es) {
                cur += ev[1];
if (cur > cap) { bad.add(emp); break; }
            }
        }
return bad;
    }

// 小样例,随手测一下
publicstaticvoidmain(String[] args){
        List<Booking> list = Arrays.asList(
new Booking("A",  9*60, 10*60),
new Booking("A",  9*60+30, 11*60),
new Booking("B",  9*60, 10*60),
new Booking("B", 10*60, 11*60), // 刚好拼接不冲突
new Booking("C",  9*60, 10*60),
new Booking("C",  9*60+10,  9*60+20) // C如果K=2就不超
        );
        Map<String,Integer> cap = new HashMap<>();
        cap.put("A", 1);
        cap.put("B", 1);
        cap.put("C", 2);
        System.out.println(findOverbookedEmployees(list, cap)); // 预期 [A]
    }
}

逐人排序,若总区间数是N,则总体 O(N log N),内存 O(N)。并发组装的时候注意别一次性把所有人的事件扔进一个大数组,按人处理更稳。

本来还想扯下可视化告警、冲突自动重排…等等我先接个电话…行了先这样,回头有人问我再补点儿坑位处理哈。

-END-

我为大家打造了一份RPA教程,完全免费:songshuhezi.com/rpa.html

最后给大家分享一份不错的副业资料,点击下方公众号,回复关键字: 副业 领取,也可以链接我领取,微信:hls404