程序员老鬼

这…以后谁还敢连公司WIFI?

这帖看得我后背一凉。你以为连的是公司WiFi,实际连上的是“赛博监工系统”。全公司63台设备,平均工作占比42.5%,这数字一出来,老板估计先沉默,打工人先关流量。

Image

最搞笑的是那几个“重点设备”。有人小红书占69.1%,全程在线,主打一个人到工位魂在别处;有人B站、QQ音乐、腾讯视频一条龙,工位秒变客厅;还有个BOSS直聘点了50次,这已经不是摸鱼了,这是边上班边给自己找下家,HR看完血压都得动一下。

我看这事最狠的地方,不是员工刷了多少小红书,是很多人还以为公司压根看不见。现在好了,连你10:55才上线都给你记得明明白白,工位上那点自由感,瞬间没了一半。

面试题:句子相似性

这题看着像字符串题,真写起来,很多人第一刀就砍错了。

一上来就按字符比,或者先把句子全拆成 Set 去重,这路子基本都不对。题目叫“句子相似性”,判断的不是两个句子长得像不像,而是相同位置上的单词,是否相等或者属于给定的相似关系。这地方我第一眼就会先盯两个点:句子长度是不是一致;相似词对是不是双向可达。前一个漏了直接白跑,后一个漏了结果会错得很安静。整体写法上,还是老老实实用哈希表最稳。行文气质参考了你给的技术文风格,但内容和代码都是重新写的。

先看核心判断:

  1. 两个句子单词数量不同,直接 false。
  2. 同位置单词相同,继续。
  3. 不同的话,就去相似词表里查,查不到也是 false。

这种题没必要上并查集,除非题目追问“传递相似”。普通版里,great 和 fine 相似,不代表 great 和 good 一定相似,题意通常只要求你认给定边。

Java 代码我一般会这么写,够短,也够现场:

import java.util.*;

publicclassSentenceSimilarity{

publicbooleanareSentencesSimilar(
            String[] words1,
            String[] words2,
            List<List<String>> pairs)
{

if (words1 == null || words2 == null || words1.length != words2.length) {
returnfalse;
        }

        Map<String, Set<String>> graph = new HashMap<>();
for (List<String> pair : pairs) {
            String a = pair.get(0);
            String b = pair.get(1);
            graph.computeIfAbsent(a, k -> new HashSet<>()).add(b);
            graph.computeIfAbsent(b, k -> new HashSet<>()).add(a);
        }

for (int i = 0; i < words1.length; i++) {
if (Objects.equals(words1[i], words2[i])) {
continue;
            }
            Set<String> set = graph.get(words1[i]);
if (set == null || !set.contains(words2[i])) {
returnfalse;
            }
        }
returntrue;
    }
}

拿一组数据过一下就很清楚:

words1 = ["great", "acting", "skills"];
words2 = ["fine", "drama", "talent"];
pairs = [["great", "fine"], ["acting", "drama"], ["skills", "talent"]];

三个位置都能对上,所以结果是 true。

这题真正容易翻车的,不是代码量,是细节判断。比如有人会把相似关系只存一边,那 fine -> great 查不到;还有人看到单词相等,还傻乎乎去图里查一次,纯属多余。时间复杂度也很直白:建图是 O(pairs.size()),遍历句子是 O(n),够用了。

这种题做完别急着提交,我一般会多补两组脏数据:一组长度不等,一组单词相同但 pairs 为空。能把这两组扛住,基本就稳了。