程序员老鬼

大厂员工爆料:千辛万苦,终于考上公务员上岸了,实现了月薪从25000降到5000的飞跃。

月薪2万5的时候,人是空的。月薪5千了,人倒像活过来了。

Image

评论区也挺真实。有人说这不是降薪,是花钱买命。还有人说年轻时嫌五千少,真被大厂狠狠干几年,就知道稳定和下班有多香。

我看这事最扎心的,不是“考公值不值”,是很多人已经默认高薪得拿命换。2万5听着体面,真摊到时薪和精神损耗上,HR看完都未必敢细算。工资是降了,苦味没准也一起降了,这账不少打工人心里门儿清。

面试题:翻转游戏

一上来很多人会把“翻转游戏”写复杂,先 DFS、再回溯、再记忆化,代码抡一圈,最后题目其实只问一件事:当前字符串里,有没有一刀翻下去,能把 "++" 变成 "--"。这种题我一般先不急着谈博弈论,先把最朴素那层写稳。不然你后面就算真要扩成“谁先手必胜”,底子也是虚的。这个取舍,跟我平时看线上问题差不多,先抓最直接的现场,再谈抽象。

题目不绕,给一个只包含 '+' 和 '-' 的字符串,每次只能把连续两个 "++" 翻成 "--",问所有可能的下一步结果。

先别想着花活,遍历一遍就够了。看到 s[i] == '+' && s[i + 1] == '+',就说明这里能翻。把这一段替换掉,收集结果,继续往后扫。

Java 我会这么写,代码短一点,读起来也像真会放到提交框里的:

import java.util.ArrayList;
import java.util.List;

publicclassSolution{

public List<String> generatePossibleNextMoves(String currentState){
        List<String> ans = new ArrayList<>();
if (currentState == null || currentState.length() < 2) {
return ans;
        }

char[] arr = currentState.toCharArray();
for (int i = 0; i < arr.length - 1; i++) {
if (arr[i] == '+' && arr[i + 1] == '+') {
                arr[i] = '-';
                arr[i + 1] = '-';
                ans.add(new String(arr));
                arr[i] = '+';
                arr[i + 1] = '+';
            }
        }
return ans;
    }
}

这段代码有个味道我挺在意:改完再还原。别一上来就 substring(0, i) + "--" + substring(i + 2) 拼字符串,当然也能过,但现场写多了就知道,能少造对象就少造,尤其这种循环里反复处理的小题,char[] 更顺手。

拿 "++++" 试一下就明白了:

  • 第 0、1 位能翻,得到 "--++"
  • 第 1、2 位能翻,得到 "+--+"
  • 第 2、3 位能翻,得到 "++--"

所以结果就是这 3 个。

这里还有个新手常见别扭点: 看到 "++++",有些人会下意识觉得只能翻成头尾两种,其实中间那一刀也合法。这个题不难,坑主要就在“连续两个”这四个字,别看漏。

再补个我更愿意写的测试片段,简单直接:

publicstaticvoidmain(String[] args){
    Solution s = new Solution();
    System.out.println(s.generatePossibleNextMoves("++++"));
}

输出就是:

[--++, +--+, ++--]

这题本质不在技巧,在细。能翻的位置别漏,翻完记得恢复,边界别炸。 算法上就是一次线性扫描,时间复杂度 O(n),真没必要写得像在打大仗。