他简历里写的是985本硕、竞赛冠军、GitHub开源大牛,但入职第一周连个接口都调不通,到底是天赋型选手还是包装型选手?
最近看到刷到一篇帖子,直接把我看乐了:说是上周组里来了个应届生,简历华丽得像PPT模板:985本硕、竞赛拿奖、开源项目上千star……结果一上班,连个登录接口都对接不明白,天天被产品摁在地上输出。
说真的,我也不是第一次见了。简历是能打,但工作现场不是考试,是真刀真枪的实战。以前我们组也来过一个“战神”,简历写得我都差点以为我该离职让位了,结果一让写业务代码,人直接CPU占用100%,一句“这个我没做过”成了口头禅。
我觉得吧,这年头简历太容易包装了,开源项目star数很多是靠蹭热度或者“团队贡献”,根本不是实际能力的体现。真本事是看你面对烂需求还能写出能跑的代码,而不是光会写“技术栈:全栈熟练”。
所以啊,面试不该只看简历,要多看看“动手能力”和“debug思维”。不然招聘的是项目README的维护者,不是能写代码的人。你们组有遇到这种“简历幻术师”吗?【备注:文末可领最新资料】
算法题:最大人工岛
局长
刷算法题有时候像谈恋爱,刚开始你觉得自己只是随便看看,结果一道题让你牵肠挂肚,这不,我最近又栽在了「最大人工岛」上。
题目大意是这样的:
你有一个只包含 0 和 1 的二维数组,1 表示陆地,0 表示海洋。你可以最多将一个 0 变成 1,问你此时可以构成的最大“人工岛”面积是多少。
听起来是不是有点眼熟?没错,这就是 LeetCode 的原题变种:827. Making A Large Island。不过这个“人工”二字,属实让我想起了某些人工KPI,越改越水 🙃。
这个题其实就是在考两个主要点:
1. 连通块搜索(DFS / Union-Find) 2. 替换 0 为 1 后对“周围岛屿”的合并模拟
思路就是先遍历全图,找出所有连通的 1 块(也就是天然岛屿),并记录它们的面积。然后再遍历每一个 0,试着“造个岛”,看看替换之后它周围能连成多大的岛屿。
我这里用 DFS 来做标记处理,比较直观,当然并查集也能做,写法风格不同罢了。上代码!
publicclassMaxArtificialIsland {
privatestaticfinalint[][] DIRS = {{0,1},{1,0},{0,-1},{-1,0}};
privateint n;
publicintlargestIsland(int[][] grid) {
n = grid.length;
int[][] islandId = newint[n][n]; // 标记每个岛屿的编号
Map<Integer, Integer> areaMap = newHashMap<>(); // 岛屿编号 -> 面积
intid=2; // 从2开始,避免与0,1冲突
// 第一步:用DFS标记每个岛屿
for (inti=0; i < n; i++) {
for (intj=0; j < n; j++) {
if (grid[i][j] == 1 && islandId[i][j] == 0) {
intarea= dfs(grid, islandId, i, j, id);
areaMap.put(id, area);
id++;
}
}
}
intmax=0;
for (int v : areaMap.values()) max = Math.max(max, v); // 原始最大岛屿面积
// 第二步:枚举每一个0,看看变成1之后能连接多大面积
for (inti=0; i < n; i++) {
for (intj=0; j < n; j++) {
if (grid[i][j] == 0) {
Set<Integer> seen = newHashSet<>();
intarea=1; // 把当前0变成1
for (int[] d : DIRS) {
intni= i + d[0], nj = j + d[1];
if (ni >= 0 && ni < n && nj >= 0 && nj < n) {
intneighborId= islandId[ni][nj];
if (neighborId > 1 && seen.add(neighborId)) {
area += areaMap.get(neighborId);
}
}
}
max = Math.max(max, area);
}
}
}
return max == 0 ? n * n : max;
}
privateintdfs(int[][] grid, int[][] islandId, int i, int j, int id) {
if (i < 0 || i >= n || j < 0 || j >= n || grid[i][j] != 1 || islandId[i][j] != 0) {
return0;
}
islandId[i][j] = id;
intarea=1;
for (int[] d : DIRS) {
area += dfs(grid, islandId, i + d[0], j + d[1], id);
}
return area;
}
}上面这段代码怎么说呢,虽然看着没啥骚操作,但胜在逻辑清晰、扩展性强,而且很适合在面试的时候一边讲一边写,显得自己逻辑思路贼清楚(虽然内心慌得一匹😅)。
那说到实战,有人会问:能不能优化?当然能,如果你一开始用并查集来做岛屿合并,会在大图场景下省下不少时间,尤其是搜索那块的重复访问。
但我个人更喜欢 DFS,因为在日常写业务代码时你也经常需要“分块处理”,很多时候用递归是最省事的。说白了,还是熟悉什么写什么,别强行装高深。
不过这个题其实也有个有趣的点是:你不造岛,可能就是最优解 🤷♂️。全是1的时候,直接返回 n * n。也就是全员996的时候,领导再怎么折腾,也造不出更高效的生产力了。
说到底,这题让我最大的感触就是:先把已有的搞清楚,再来谈优化或者新增。很多人写代码总想着怎么“造一个新功能”,但其实真正难的,是理清楚现有这堆破事儿。
你问我最大的人造岛?我劝你先试试清理 legacy 代码,那才是真正的“挖掘潜力”。
⛏️你造的是岛,我挖的是坑……祝你刷题愉快,不迷路~
最后,我为大家打造了一份deepseek的入门到精通教程,完全免费:https://www.songshuhezi.com/deepseek
也可以看我写的这篇文章《DeepSeek满血复活,直接起飞!》来进行本地搭建。
-END-
以上,就是今天的分享了,看完文章记得右下角点赞,也欢迎在评论区写下你的留言。