隔壁部门同事,去年提离职后,绩效考核被打了个C,年终奖直接从5万降到1万。 后来才知道,他提完离职就开始摸鱼,项目交接敷衍了事~
刚看到个贴子:说隔壁部门有同事,去年提了离职,结果绩效被打C,年终从5万变1万。后来才知道,人家提完就开始疯狂摸鱼,交接随便糊弄,搞得后面接盘同事进度全被拖,部门KPI也一起陪葬。
网友们的回复我看了看,有的说公司报复离职员工,也有人觉得摸鱼还想拿大红包,本来就不现实。
我觉得这事吧,得分两头看。单纯因为“提离职”就打低分,那确实不地道;但你人还在岗,拿着工资就开始摆烂、交接乱七八糟,影响的是一整组人的业绩,那就不是“情绪问题”,而是职业操守问题了。
说到底,绩效不养老,年终奖也不是同情分。离职可以,但起码把最后一棒认真跑完,体面走人,比什么都重要。工作可以不爱,但别砸自己的口碑,圈子就这么大,路还长呢。
面试题:第K个语法符号
昨天晚上十一点多吧,我在公司楼下抽烟(别学哈),我们组小李突然微信丢我一句:“东哥,第K个语法符号到底咋想啊,我看着像在生成字符串,越写越爆内存。”我当时就乐了,这题看着像字符串题,真按字符串生成,你别说K了,N稍微大点你机器就开始“风扇起飞”,跟线上Tomcat线程打满一个味儿……人是要成长的对吧,就得学会不把东西真的造出来。
这题规则你肯定记得:第1行是 0,每一行把上一行每个符号展开,0 -> 01,1 -> 10。你盯着看两分钟,会发现它其实就是一棵二叉树的“左右孩子”:父亲是0,左孩子还是0右孩子变1;父亲是1,左孩子还是1右孩子变0。然后第N行第K个,本质就是你从根一路走到第K个叶子,走到右边就“翻转一次”,走到左边就“不翻”。
关键是怎么知道第K个叶子这条路右转了几次。这个地方我之前也卡过一下(人脑就是这样,明明简单还爱绕)。你把 K-1 写成二进制就很顺了:K 是从1开始数,第一个叶子对应全走左,所以用 K-1 变成从0开始编号。K-1 的二进制里每一个 1,都代表某一层“走了右边”,而走一次右边就翻一次。那最终符号就是:翻转次数的奇偶性,也就是 bitcount(K-1) % 2。翻偶数次还是0,翻奇数次变1。
我当时给小李的说法更土一点:你别管N多大,只要K合法,答案跟N其实没啥关系(当然前提是第N行长度够到K),就看 K-1 里有几个1,奇数就1,偶数就0。讲完他就回我一个“卧槽”,然后又问我“那递归还能写不”。能写,但真没必要,递归还得算中点 2^(n-2),写着写着还容易溢出,线上最烦这种“看似优雅实际埋雷”的写法。
来,Java 直接上,代码别整花的,能跑能读就行:
publicclassKthGrammar{// 返回第 N 行第 K 个符号(1-indexed)publicintkthGrammar(int n, int k){// n 在这个公式里不参与计算,但保留参数符合题意long x = (long) k - 1; // 变成 0-indexint flips = Long.bitCount(x); // 右转次数 = 1 的个数return flips & 1; // 奇偶性 }// 你要是面试官非要你“按定义递推”,也给个稳一点的迭代版(不造字符串)publicintkthGrammarByWalk(int n, int k){int ans = 0; // 从第1行的 0 出发long idx = k - 1L; // 0-index// 走 n-1 层,每一层看当前层是走左(0)还是走右(1)for (int level = n - 1; level > 0; level--) {// 这一层决定方向的 bit:从高到低看long bit = (idx >> (level - 1)) & 1L;if (bit == 1L) ans ^= 1; // 走右翻转 }return ans; }publicstaticvoidmain(String[] args){ KthGrammar s = new KthGrammar(); System.out.println(s.kthGrammar(1, 1)); // 0 System.out.println(s.kthGrammar(2, 2)); // 1 System.out.println(s.kthGrammar(4, 5)); // 1 System.out.println(s.kthGrammarByWalk(4, 5)); // 1 }}你看这玩意儿就很像我们平时做架构:别一上来就“把全量数据拉下来算一遍”,要先问一句“我到底需要的是什么”。这题你需要的是第K个,不是整行字符串;那就只算路径翻转次数就完了。好了我先不说了,刚有人在群里@我说线上又有个慢SQL,八成又是谁默认配置没改,回头我去怼他两句……