月薪两万五的大厂人,硬是把自己卷成了月薪五千的公务员。这事儿听起来像个段子,细品之下又觉得特别现实。
你以为他们图的是那份工资吗?还真不是。图的是不用半夜开会,不用周末背锅,不用一边熬夜改PPT,一边担心下一轮优化的名单里会不会出现自己的名字。大厂给钱确实猛,但“榨人”也从不手软。

更“狠”的是,上岸这条路本身也不好走。白天上班已经像一块被拧干的毛巾,晚上还得强打精神刷题、背申论。周末别人在睡懒觉,他得掐着表做行测,脑子都快刷出火星子了。有网友评论这是“降薪避险”,也有人说“拿高薪那几年已经赚到了”。要我说,这两种看法或许都对了一半。
说白了,这不是简单的工资“跳水”,而是用现金流去交换稳定性,用持续的情绪损耗去换一个能喘口气的日子。钱是少了,但命(或者说生活品质)估计能多剩一点。摘下大厂的工牌,整个人没准儿都能睡踏实了。
算法题:翻转游戏
一看到“翻转游戏”这种题名,很多人的第一反应就是把回溯、博弈、状态压缩这些高级货全往上怼。先别急,如果只是基础版本,这题其实没那么复杂。
题目通常是这样:给你一个只包含 + 和 - 的字符串,每次操作只能把连续两个 ++ 翻成 --,要求返回所有可能的一步操作结果。
面对这类题目,我通常会先搞清楚一个核心点:题目到底是要求“所有下一步状态”,还是判断“先手玩家能否必胜”。这两者看着像,但代码写法差很多。如果只是要所有可能的结果,那就没必要把自己绕进递归的复杂逻辑里。
最直接的处理方式就是顺着字符串扫描一遍,每当看到 ++,就把这一段替换成 --,然后把新生成的字符串收集起来。
def generate_moves(current_state: str) -> list[str]:
ans = []
for i in range(len(current_state) - 1):
if current_state[i] == '+' and current_state[i + 1] == '+':
next_state = current_state[:i] + '--' + current_state[i + 2:]
ans.append(next_state)
return ans
例如:
print(generate_moves("++++"))
# 输出:['--++', '+--+', '++--']
这道题没什么玄机,本质上就是一次线性扫描。因为涉及字符串拼接,所以时间复杂度是 O(n^2)。不过别一看到拼接就慌,这里最多扫描 n 次,每次生成一个新字符串,对于这类算法与数据结构练习题来说完全够用。
也有人喜欢先把字符串转成列表,原地修改元素,生成结果后再改回去。这种方法当然也可以。
def generate_moves_v2(current_state: str) -> list[str]:
chars = list(current_state)
ans = []
for i in range(len(chars) - 1):
if chars[i] == chars[i + 1] == '+':
chars[i], chars[i + 1] = '-', '-'
ans.append(''.join(chars))
chars[i], chars[i + 1] = '+', '+'
return ans
这种写法更像是现场排查:临时改动两个位置,记录下结果,然后立即恢复原状。如果后续题目升级为“进行多次翻转”或“递归判断胜负”,这种原地修改再恢复的思路可能更顺手。
这道题真正容易出错的地方,往往不是解题思路,而是边界条件。
比如输入是 "+",肯定返回空列表。输入是 "+-++-",只能翻中间那两个连续的 +,不能把不相邻的加号也算进去。还有一个低级错误是写成 current_state[i:i+2] == '+',这连切片长度都错了,一眼就能看出问题。
所以,这道题的拿分关键不在于“会不会”,而在于“写没写拧巴”。先分清题意,再决定是用简单的线性枚举,还是更复杂的递归博弈。
从大厂的激烈竞争到公务员的稳定上岸,再从看似复杂的“翻转游戏”中提炼出清晰的解题逻辑,本质上都是在做选择与权衡。无论是职业路径还是解题思路,清晰的认知和直接的行动往往比复杂的套路更有效。如果你对类似的职业选择或技术话题有更多想法,欢迎来云栈社区的开发者广场和大家一起聊聊。