程序员老鬼

某33岁后端开发:今年找工作太难了,小厂觉得你待不久,中厂觉得你贵,大厂觉得你老。。

刚刷到这个33岁后端找工作的帖子

他说今年找工作难,难在哪?小厂一看你33岁,觉得你肯定待不久,怕刚培养熟了你就跑路。中厂一看你履历,觉得你要价高,岗位预算又卡得死,聊两句就开始打太极。大厂更直接,嘴上说看能力,心里可能已经在算年龄了:这个人还能卷几年?

Image

最难受的是,这些理由你还没法反驳。你说我稳定,人家不信。你说我可以降薪,人家又怕你心里不平衡。你说我技术还行,人家又觉得年轻人也能干,还便宜。

33岁明明也不算老,放别的行业可能刚到能扛事的时候,到了互联网就像进入倒计时。打工人看完真有点沉默,这哪是找工作,像是在闯三道门,每道门都写着“不是你不行,是我们不想担风险”。

面试题:统计实验的数量

实验明明只有 6 条,结果要输出 9 行。

这题第一眼别急着 count,先看要求里最别扭的一句:没有实验的数据,也要输出 0。平台固定是 Android、IOS、Web,实验名固定是 Reading、Sports、Programming,所以它不是单纯统计已有数据,而是把 3×3 的格子全部补齐。原题就是 LeetCode 1990,表里有 experiment_id、platform、experiment_name 三个字段。

我见过不少人写这题,上来就一个 Map<String, Integer>,扫完数据直接输出。跑样例没几行就发现不对:Android + Sports 这种根本没出现过的组合,被你漏掉了。

这题真正要做的不是“统计出现了什么”,而是“固定报表维度下,每个格子有多少”。

用 Java 写,我一般会先把报表骨架放出来:

classExperiment{
int id;
    String platform;
    String name;

    Experiment(int id, String platform, String name) {
this.id = id;
this.platform = platform;
this.name = name;
    }
}

输入数据假设是这样:

List<Experiment> rows = List.of(
new Experiment(4, "IOS", "Programming"),
new Experiment(13, "IOS", "Sports"),
new Experiment(14, "Android", "Reading"),
new Experiment(8, "Web", "Reading"),
new Experiment(12, "Web", "Reading"),
new Experiment(18, "Web", "Programming")
);

关键代码别写复杂,两个数组就是题目给死的维度:

String[] platforms = {"Android", "IOS", "Web"};
String[] names = {"Reading", "Sports", "Programming"};

Map<String, Integer> counter = new HashMap<>();

for (Experiment e : rows) {
    String key = e.platform + "#" + e.name;
    counter.put(key, counter.getOrDefault(key, 0) + 1);
}

for (String p : platforms) {
for (String n : names) {
        String key = p + "#" + n;
int count = counter.getOrDefault(key, 0);
        System.out.println(p + " " + n + " " + count);
    }
}

输出大概就是:

Android Reading 1
Android Sports 0
Android Programming 0
IOS Reading 0
IOS Sports 1
IOS Programming 1
Web Reading 2
Web Sports 0
Web Programming 1

这里有个小坑,我不太建议把 key 拼成 platform + name。现在这几个字符串看着没问题,真放到业务代码里,迟早会遇到边界。比如两个字段拼完撞到一起,排查起来很烦。加个分隔符,或者干脆写个小对象当 key,都比裸拼靠谱。

如果想写得再稳一点,可以这样:

static String buildKey(String platform, String name){
return platform + "\u0001" + name;
}

\u0001 这种字符正常业务字段里几乎不会出现,比 # 还稳一点。刷题没必要这么讲究,但写久了代码,手会自己避开这种小坑。

这题放在 SQL 里,思路其实也是一样:先造出 9 个组合,再把真实数据左连接上去统计。放到 Java 里,就是先固定维度,再用 Map 补数量。

复杂度也没什么花活。假设实验记录有 n 条,统计扫一遍是 O(n),最后输出固定 9 行,可以当成常数。空间主要是 Map,最多也就 9 个组合。

这题不难,难的是别被“统计”两个字带偏。它要的是一张完整报表,不是流水明细里出现过什么。遇到这种题,我一般先问自己一句:缺失的维度要不要补 0?

要补,那就先造格子。然后再数。