程序员老鬼

前pdd员工跳槽被现同事举报导致竞业被发现,赔100+w~

刚刷到一个离谱的瓜:前 PDD 员工跳槽去阿里,结果因为抢了同事的绩效被眼红,竟然被人反手举报回原公司,竞业协议被翻出来,最后赔了 100 多万。

Image

作为程序员,我第一反应是——这就是典型的“代码写得好,不如人心算得精”。技术人的思维总想着优化逻辑、提高性能,可在职场里,人的变量比代码 bug 还多。网友说举报行为太阴了,我认同,但也得承认职场里这种暗招不少,尤其涉及利益和绩效的时候。

换个角度想,竞业协议本来就是“埋在 readme 里的一行注释”,大多数人忽略,真触发时就是毁灭性 bug。程序员写代码要做单元测试,职场合同也一样,别觉得“不会触发”,一旦上线,代价巨大。

总的来说,这事提醒我们:职场不光是写好代码,更要写好“异常处理”。合同要看清,同事要防备,别让自己陷入无解的 try-catch 里。【备注:文末可领最新资料】

算法题:验证栈序列

昨晚十一点多,在公司楼下吹风,手机叮一下,小李问我“哥,那个…验证栈序列怎么写来着?”我困得要命但脑子一激灵:这玩意儿别绕,想着就能敲,思路超直。

就是给你两个序列,一个是入栈顺序 pushed,另一个是声称的出栈顺序 popped。问:有没一种合法的“先进后出”操作,让 popped 真能被弹出来。你们知道吧,别被字面吓到,本质就模拟手里的那只“临时碗”——栈。

一边把 pushed 的元素往栈里压,一边看栈顶和 popped 当前指针对不对上。对上就弹,指针右移;不对上就继续压。到最后,如果都弹干净了,说明 popped 合法。整个过程一次扫描,没玄学。

publicclassValidateStackSeq{
publicstaticbooleanvalidateStackSequences(int[] pushed, int[] popped){
if (pushed == null || popped == null || pushed.length != popped.length) returnfalse;
        java.util.Deque<Integer> stack = new java.util.ArrayDeque<>();
int j = 0; // 指向 popped
for (int x : pushed) {
            stack.push(x);                 // 先压
while (!stack.isEmpty() && j < popped.length && stack.peek() == popped[j]) {
                stack.pop();               // 能弹就一直弹
                j++;                       // 出栈指针前进
            }
        }
return j == popped.length;         // 都匹配上才算真
    }

// 随手放个小例子,别太当真
publicstaticvoidmain(String[] args){
int[] a = {1,2,3,4,5};
int[] b = {4,5,3,2,1};
int[] c = {4,3,5,1,2};
        System.out.println(validateStackSequences(a, b)); // true
        System.out.println(validateStackSequences(a, c)); // false
    }
}

我刚才在电梯口回他:栈顶永远是下一个“可能被弹”的人,对吧?那我只要在每次压完之后,尽可能把和 popped[j] 相等的东西弹光,就等于把“必须发生的出栈”先完成了。因为任何合法序列都不可能跳过栈顶去弹别的。嗯…说白了就是贪心+模拟。

时间 O(n),每个元素最多进一次出一次;空间 O(n),那个临时栈撑死放 n 个。嗯我这会儿脑子清醒了点儿。

有人问:值会不会重复?可以,但不影响,上面逻辑只看“当前栈顶是否等于 popped[j]”。还有空数组?俩都空就 true,只空一个那就是 false。再有就是…别把它当队列题,先进后出这点别忘。

-END-

我为大家打造了一份RPA教程,完全免费:songshuhezi.com/rpa.html

最后给大家分享一份不错的副业资料,点击下方公众号,回复关键字: 副业 领取,也可以链接我领取,微信:hls404