程序员老鬼

离开鹅厂之后,35+同事们的就业现状

刚看到个贴子,说有网友爆料离开鹅厂后的35+同事现状。

Image

有人还在互联网坚守岗位,有的去了字节、也有人拿了“礼包”准备回老家,还有人存款两百万准备外包躺平,甚至有人直接打算去新加坡定居。看完这几种结局,说实话挺唏嘘的。

网友们讨论得热闹,有人说“卷不动了”,也有人羡慕能重新出发。可我觉得这事吧,不是卷不卷的问题,而是每个人都在找自己能喘口气的地方。三十五岁以后,拼的不是熬夜的体力,而是心态和方向。

说到底,时代在变,选择也在变。只要能稳住生活、心态不崩,去哪儿都不算失败。工作是谋生,不是求罪。【备注:文末可领最新资料】

算法题:破解保险箱

说个比较接地气的版本,题目是“破解保险箱”(就是那个四个滚轮、每轮 0–9,像 LeetCode 的 Open the Lock 那种)。先把问题说清楚:给你一个初始状态 "0000",有一组不可踩的死锁(deadends),还给你一个目标 combination,允许的操作是把某一位向上或向下拨一格(0 上一格是 9,9 下一个是 0)。问最少多少步能到达目标,不能经过死锁。下面我把思路说清楚,再给出 Java 实现,代码能直接跑,注释也够用,通俗易懂。

思路:这个问题本质是最短路径问题,状态空间是 10^4(10000)个节点,边是每次拨动一位到相邻状态。因为每步代价相同,用 BFS(广度优先搜索)最合适。把 "0000" 作为起点,按层展开,每次从当前组合生成 8 个相邻组合(4 位 × 2 方向),遇到 deadend 跳过,遇到没访问过的则加入队列并标记访问。遇到目标就返回步数。为了减半常数,可以在开始时先判断 "0000" 是否是 deadend,或者目标是不是 "0000"。时间复杂度最坏 O(10000);空间复杂度也在 O(10000) 量级。

实现(Java):

import java.util.*;

publicclassOpenLock{
// BFS 解法
publicintopenLock(String[] deadends, String target){
        Set<String> dead = new HashSet<>(Arrays.asList(deadends));
        String start = "0000";
if (dead.contains(start)) return -1;
if (start.equals(target)) return0;

        Queue<String> q = new ArrayDeque<>();
        Set<String> seen = new HashSet<>();
        q.offer(start);
        seen.add(start);
int steps = 0;

while (!q.isEmpty()) {
int size = q.size();
            steps++;
for (int i = 0; i < size; i++) {
                String cur = q.poll();
for (String nei : neighbors(cur)) {
if (seen.contains(nei) || dead.contains(nei)) continue;
if (nei.equals(target)) return steps;
                    seen.add(nei);
                    q.offer(nei);
                }
            }
        }
return -1; // 无法到达
    }

// 生成当前组合的 8 个相邻状态
private List<String> neighbors(String s){
        List<String> res = new ArrayList<>(8);
char[] cs = s.toCharArray();
for (int i = 0; i < 4; i++) {
char old = cs[i];
            cs[i] = (char) ((old - '0' + 1) % 10 + '0'); // +1
            res.add(new String(cs));
            cs[i] = (char) ((old - '0' + 9) % 10 + '0'); // -1 (等于 +9 mod10)
            res.add(new String(cs));
            cs[i] = old; // 恢复
        }
return res;
    }

// 简单测试
publicstaticvoidmain(String[] args){
        OpenLock solver = new OpenLock();
        String[] dead = {"0201","0101","0102","1212","2002"};
        System.out.println(solver.openLock(dead, "0202")); // 6
        System.out.println(solver.openLock(new String[]{"8888"}, "0009")); // 1
    }
}

额外提示:1)如果死锁集很小、目标很远,普通 BFS 就能在毫秒级搞定;2)如果想把常数再降一点,可以用双向 BFS(从起点和目标同时扩散,交汇时停止),对 10000 状态也会快不少;3)注意边界条件:起点是死锁、目标等于起点、deadends 包含目标等情况都要提前处理。总体上,这题适合用来练 BFS、状态编码和剪枝思维,代码量不大但很多细节要注意。就这些,回头你试试把上面的 BFS 换成双向的,我也可以直接给你改造版。

-END-

我为大家打造了一份RPA教程,完全免费:songshuhezi.com/rpa.html

最后给大家分享一份不错的副业资料,点击下方公众号,回复关键字: 副业 领取,也可以链接我领取,微信:hls404