鼠标多停两秒都要被记一笔,这公司也是真把人当外包脚本跑了。OpenClaw一上,几点开机、几点锁屏、切了几次窗口,全给你挂后台盯着,工位上坐的是人,系统里记的是一串“行为日志”。

说这玩意最后八成先把会装忙的人筛成优等生,真干活的反而最容易被误伤。
我看这事最离谱的地方,不是监控,本来很多公司就爱偷摸看。离谱的是它连装都不装了,直接摆明车马告诉你:别谈信任,咱们就按鼠标呼吸频率算忠诚度。
以后打工人发个呆都得有技巧,切出去回个消息都像在拆弹。HR看完报表觉得自己掌控全局,员工看完只会默默更新简历。
面试题:账户合并
这题看着像并查集模板题,真下手时最容易写歪的地方,不是合并两个名字,而是你会忍不住拿“账户”当节点。那就慢了,而且后面邮箱去重会拧巴。 这题第一眼我一般就盯邮箱。名字不重要,邮箱才是唯一身份标识。两个账户只要出现同一个邮箱,本质上就是一个人。
拿题目里的输入去想就很顺:
["John", "a@mail.com", "b@mail.com"]["John", "b@mail.com", "c@mail.com"]["Mary", "x@mail.com"]第二个账户里有 b@mail.com,那前两个账户就得并起来。最后输出时,再把同一个集合里的邮箱排个序,名字挂在最前面就行。
这题适合并查集,套路很直接:
先遍历所有账户,用 email -> accountIndex记录邮箱第一次出现的位置。后面再碰到同一个邮箱,说明两个账户属于同一组,直接 union。全部扫完之后,再按根节点把邮箱归堆。 每堆邮箱排序,前面补上账户名。
核心代码我一般会这么写,够用了,不整那些花的:
classUnionFind{int[] parent; UnionFind(int n) { parent = newint[n];for (int i = 0; i < n; i++) parent[i] = i; }intfind(int x){if (parent[x] != x) parent[x] = find(parent[x]);return parent[x]; }voidunion(int a, int b){int pa = find(a), pb = find(b);if (pa != pb) parent[pb] = pa; }}主流程也不复杂,关键是别把邮箱和账户两套关系写乱了:
public List<List<String>> accountsMerge(List<List<String>> accounts) {int n = accounts.size(); UnionFind uf = new UnionFind(n); Map<String, Integer> emailOwner = new HashMap<>();for (int i = 0; i < n; i++) { List<String> acc = accounts.get(i);for (int j = 1; j < acc.size(); j++) { String email = acc.get(j); Integer old = emailOwner.putIfAbsent(email, i);if (old != null) { uf.union(i, old); } } } Map<Integer, TreeSet<String>> group = new HashMap<>();for (int i = 0; i < n; i++) {int root = uf.find(i); group.computeIfAbsent(root, k -> new TreeSet<>());for (int j = 1; j < accounts.get(i).size(); j++) { group.get(root).add(accounts.get(i).get(j)); } } List<List<String>> ans = new ArrayList<>();for (Map.Entry<Integer, TreeSet<String>> entry : group.entrySet()) { List<String> item = new ArrayList<>(); item.add(accounts.get(entry.getKey()).get(0)); item.addAll(entry.getValue()); ans.add(item); }return ans;}这里有两个坑挺常见。
一个是有人按名字合并。这个不对,两个 John 不一定是一个人。 另一个是最后收集结果时没排序,直接拿 HashSet 往外吐,结果顺序不稳定,提交就炸。
复杂度也比较稳。设邮箱总数是 M,并查集近似看成常数,建图合并是 O(M),最后排序看作 O(M log M)。面试里这么答够了。
这题不难,麻烦的是脑子里节点到底是谁。把“邮箱是身份,账户是容器”这层关系想明白,代码就顺了。写这种题,我一般宁可 map 多建一层,也不愿后面一边去重一边补锅。气质上可参考这些偏实战的技术文写法,但上面这份内容是按题目重写的。
夜雨聆风