刚看到个贴子,一网友为晋升答辩,做了二十页PPT,把一年成绩猛讲一通。评委只问了一句:你在这个项目里的不可替代性是什么?他当场愣住。后来才知道,晋升名单早定好了,答辩只是走流程。
网友回帖一片骂“职场套路”“一切内定”。我觉得关键有两点。
第一,很多公司确实先拍板再开会,这个别再幻想;第二,不管公不公平,那句“不可替代性”都够戳心——拿掉你,项目会少点啥?
在我看来,答辩不只是晒KPI,更是把自己“独一份”的价值讲清楚:你解决过哪些关键问题,没有你事情会明显更麻烦。
说到底,职场不一定公平,但棋盘就这副。看清规则、增强自己的稀缺性,比在评论区骂两句,更能帮你离晋升近一点。
算法题:第K个语法符号
昨晚十一点多吧,我在公司楼下抽烟(别学哈),我们组小李发微信说线上有个“看起来很像随机”的开关,用户 A 看到是 0,用户 B 看到是 1,他怀疑缓存穿透……我一看就乐了,这玩意儿其实特像一道老题:第 K 个语法符号。就是你从 0 开始,每一行把 0 变成 01,把 1 变成 10,问第 n 行第 k 个是啥。
你要是硬生成第 n 行,那就跟秒杀时把所有请求都同步打到 DB 一样,属于“写着爽,跑着哭”。第 n 行长度是 2^(n-1),你生成字符串,内存先炸给你看。
这个题的“架构味”就在这:别碰全量,直接算点位。它的规律其实很像链路追踪往上找根因:第 k 个符号来自上一行的第 ceil(k/2) 个“父节点”。如果 k 是奇数,它跟父节点一样;如果 k 是偶数,它是父节点取反。你递归一路追到第一行就完了。
但我一般更喜欢另一个更狠的写法,省得递归栈跟我作对:答案等于 k-1 的二进制里 1 的个数的奇偶性。为啥?因为每往下一层,你走左边(奇数位)不翻转,走右边(偶数位)翻转一次。k-1 的二进制 1 的个数,恰好就是你走了多少次“右边”,翻转多少次。翻转偶数次还是 0,奇数次就是 1。
来,上 PHP,别整花里胡哨的,能跑就行:
<?phpclassSolution{// 返回第 n 行第 k 个符号(1-indexed)publicfunctionkthGrammar(int $n, int $k): int{// n 其实不影响最终计算(只要 k 在范围内),这里按题意保留参数 $x = $k - 1; $ones = 0;// 统计二进制 1 的个数(Brian Kernighan 算法)while ($x > 0) { $x &= ($x - 1); $ones++; }// 1 的个数奇偶性:奇数 -> 1,偶数 -> 0return $ones & 1; }}// 快速自测,别笑,我线上排查也这么干……$sol = new Solution();echo $sol->kthGrammar(1, 1) . PHP_EOL; // 0echo $sol->kthGrammar(2, 1) . PHP_EOL; // 0echo $sol->kthGrammar(2, 2) . PHP_EOL; // 1echo $sol->kthGrammar(4, 5) . PHP_EOL; // 1 (第4行: 01101001,第5个是1)
你看这写法就很“服务端人”的思路:O(1) 空间,时间 O(popcount(k)),k 再大也就是循环几次位操作。跟我们做高并发一样,别让请求在中间态堆出一条“字符串洪峰”。
顺手再提一句哈,小李一开始的 bug 其实是他拿用户 id 做 hash 分桶,然后分桶里又套了个“翻转规则”,结果把 k 从 1 开始当成 0 开始了,等于整体偏移一位,表现就像“随机”。我让他把 k-1 这个动作放到最前面,他立马就不骂缓存了……行了我这会儿又被喊去看个报警,先这样,回头再聊。