40以上失业的人,就不要再去招聘网站发简历了成功的可能性几乎为零。
说实话,最近刷到一条吐槽把我CPU干到冒烟:有人说“40岁以上失业了,就别去招聘网站海投了”。
我觉得吧,网站不是不能投,是别把它当唯一出路。把简历当产品说明书打磨好,同时去找同行群、老同事、前客户聊聊机会,效率往往比盲投高多了。
你要是40+,缺的真不是努力,是更聪明的“路由策略”。
算法题:优美的排列
那天在公司加班,产品拍拍我肩膀说:“东哥,你帮我排下座位呗,年会抽奖要搞点仪式感。”我心里一紧,这又不是简单排排坐,老板还补了一句:某些编号的人必须坐在“特别的位置”,不然“不优雅”…当时脑子一抽,我就想起了一道面试常考题——优美的排列。
你可以想象一下啊,有 1~n 这 n 个数字,每个数字要坐到 1~n 这 n 个位置里。要求是: 数字 x 坐在位置 i 上,要满足两个条件里的一个:
x 能整除 i 或者 i 能整除 x
也就是:x % i == 0 或 i % x == 0。 听着是不是有点像某种奇怪的“缘分匹配规则”,对上眼就能坐一起,对不上就得另找位置。
一开始我脑子里蹦出来的暴力解法,就是那种最直男的想法: “要不我全排列试一遍?总共 n! 种,逐个检查。” 结果手一摊,n=15 直接给你算废在电脑前,整整齐齐超时崩溃。
所以只能老老实实上回溯。思路其实很生活化: 就像一排椅子,从第 1 把椅子开始,一个个试着安排人坐下,谁坐上去不合适(不整除),就让他站起来换别人,直到全员坐满为止。
我当时在电脑前嘟囔着:“行吧,从 1 号位置开始排起。”顺手就敲了这么一版 Python,小伙伴你可以先感受下大概长啥样:
defcount_arrangement(n: int) -> int:
used = [False] * (n + 1)
ans = 0
defdfs(pos: int):
nonlocal ans
# 椅子都坐满了,找到一套优美方案
if pos > n:
ans += 1
return
# 试着把每个人安排到当前这个座位上
for x in range(1, n + 1):
if used[x]:
continue
# 不优雅的直接跳过
if pos % x != 0and x % pos != 0:
continue
used[x] = True
dfs(pos + 1)
used[x] = False
dfs(1)
return ans
这个版本逻辑很直给:pos 表示当前在给第几号位置找人坐;used[x] 表示这个人有没有已经坐下; 只要条件不满足就直接 continue,一点都不讲感情。
不过你要是稍微冷静下来看,会觉得还有点地方可以省点力气。比如我踩坑的时候发现两个小细节:
第一个是“尽量晚点纠结”。什么意思呢? 位置越靠后,候选的人越少(因为整除条件越来越苛刻),所以我们可以从 pos = n 往前排,这样一开始就把最刁钻的位置搞定,后面就轻松很多。代码其实就一句话的事,把 dfs(1) 改成 dfs(n),然后 if pos == 0: ans += 1,位置从 n 往 1 递减。
我当时一边改一边碎碎念:“难搞的先搞,和需求一样的,别拖。” 写出来大概这样:
defcount_arrangement(n: int) -> int:
used = [False] * (n + 1)
ans = 0
defdfs(pos: int):
nonlocal ans
if pos == 0:
ans += 1
return
for x in range(1, n + 1):
if used[x]:
continue
if pos % x != 0and x % pos != 0:
continue
used[x] = True
dfs(pos - 1)
used[x] = False
dfs(n)
return ans
第二个小心机,就是把可选的人提前过滤掉。比如位置 4 上,能坐的人其实就那几个:1、2、4。你每次都从 1 遍历到 n 有点浪费。但是这块如果再搞预处理、位运算什么的,代码一下子就变得“面试官很开心,读者很头疼”,我就没往死里优化,毕竟工作中写题不是为了炫技,能看懂才是第一位。
顺便说一句,这题还有更狠的写法,用 bitmask + 记忆化,把“哪些人已经坐下去了”压到一个整数里,比如:
用一个 mask的二进制位表示某个人有没有坐下状态就是 (pos, mask)然后 dp[pos][mask]记一下从当前状态往后还能凑出多少种优美排列
但我那天已经被产品拉去改需求三趟了,脑子转不动,就跟自己说:“算了算了,回溯够用了,别再给自己上强度了。”
回头看这道“优美的排列”,其实特别像我们每天的排期: 人是固定的一堆,人和坑位之间有各种奇怪的“整除关系”(这个人只能做这个模块,那个人只能周末上线),你要做的事就是——在有限的规则下,尽量把每个人安排到他“合适”的位置上,还得数量最大化。
所以啊,刷题这玩意儿,别老想着公式啊算发啊这些虚的,就把它当成“如何优雅地安排一群奇怪的人”的现实模拟,脑子反而会清楚一点。
行,我先去泡杯咖啡,你可以把上面那段代码敲一遍,顺手把 n 从 2~10 跑一圈,看看答案变多的那种小确幸,挺解压的。