软通外包开始盯着211、985看了,这味儿一下就冲上来了。外包岗,活没少干,锅没少背,流程一套接一套,结果门槛先给你拉成校招大厂那样,多少有点离谱。

网友说得也挺损:这是想用民企的价,挑大厂的苗。还有人补刀,说现在不是招人,是在简历里开盲盒,先把学校卡死,省得后面麻烦。
我看这事最扎心的,不是它要名校,是它明明给不了对应的体面,还特别爱端着。真有本事的211、985,转头就去更像样的平台了,谁跟你在外包池子里磨流程、对接口、熬上线。最后苦的是普通本科,连进场资格都快没了。HR那边估计也难,业务想要便宜耐用还高配,这不就是让人拿着买菜钱去点满汉全席。
算法题:生命游戏
这题一上来,很多人先把二维数组整张复制一份,然后八个方向挨个数。能过,但我第一眼一般先看两件事:一是边界怎么少写点脏判断,二是能不能原地做,别每轮都开新盘子。生命游戏这种题,数据量一大,反复拷贝矩阵其实挺笨的。写得再工整,也还是笨。
题目的麻烦点不在规则,规则就四条,麻烦在“同时更新”。你如果边遍历边直接改成 0 和 1,后面的格子读到的就不是上一轮状态了,结果一定串。
这种场景我更喜欢打标记,先借两个中间值把“旧状态”和“新状态”都塞进去:
def gameOfLife(board):
m, n = len(board), len(board[0])
dirs = [(-1, -1), (-1, 0), (-1, 1),
(0, -1), (0, 1),
(1, -1), (1, 0), (1, 1)]
for i in range(m):
for j in range(n):
live = 0
for dx, dy in dirs:
x, y = i + dx, j + dy
if 0 <= x < m and 0 <= y < n and abs(board[x][y]) == 1:
live += 1
if board[i][j] == 1 and (live < 2 or live > 3):
board[i][j] = -1 # 原来活,现在死
elif board[i][j] == 0 and live == 3:
board[i][j] = 2 # 原来死,现在活
for i in range(m):
for j in range(n):
if board[i][j] > 0:
board[i][j] = 1
else:
board[i][j] = 0
这里 -1 和 2 不是乱拍脑袋写的。关键是看邻居时,得认“上一轮谁是活的”。所以判断活细胞不能写 board[x][y] == 1,要写成:
abs(board[x][y]) == 1
因为 -1 说明它上一轮还是活的,只是这一轮准备死。这个地方我见过不少人写漏,样例一过,自测几组也像回事,提交就翻车。
再看一眼规则,其实就是:
- 活细胞周围活邻居少于 2,死
- 活细胞周围活邻居是 2 或 3,活
- 活细胞周围活邻居大于 3,死
- 死细胞周围活邻居恰好 3,活
所以真正的核心代码,只有这几行状态转移。别把简单题写成状态机大工程。
顺手拿个例子跑一下:
board = [
[0, 1, 0],
[0, 0, 1],
[1, 1, 1],
[0, 0, 0]
]
gameOfLife(board)
print(board)
# [[0, 0, 0], [1, 0, 1], [0, 1, 1], [0, 1, 0]]
这题如果面试里让我讲,我不会上来扯什么“细胞自动机思想”。先把“同时更新”说清楚,再把原地标记讲明白,基本就够了。