某33岁后端开发:今年找工作太难了,小厂觉得你待不久,中厂觉得你贵,大厂觉得你老。。
刚刷到这个33岁后端找工作的帖子
他说今年找工作难,难在哪?小厂一看你33岁,觉得你肯定待不久,怕刚培养熟了你就跑路。中厂一看你履历,觉得你要价高,岗位预算又卡得死,聊两句就开始打太极。大厂更直接,嘴上说看能力,心里可能已经在算年龄了:这个人还能卷几年?
最难受的是,这些理由你还没法反驳。你说我稳定,人家不信。你说我可以降薪,人家又怕你心里不平衡。你说我技术还行,人家又觉得年轻人也能干,还便宜。
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?
要补,那就先造格子。然后再数。