Py学习  »  Git

组里有个P7,为了防止被裁,把核心计费模块的代码写得晦涩难懂,甚至不提交 Git。 结果CTO直接招了个外包团队,当天就让他走人了!

码小辫 • 6 月前 • 264 次点击  

码小辫 丝认证

点击关注后,你不仅获得一个找资源的工具,更获得一个有趣的灵魂  ▶  ▶  ▶


刚看到个贴子:说有个P7,为了防裁员,把核心计费模块写成天书,还自己加了一堆混淆逻辑,代码从不提 Git,只在服务器留一份,觉得公司动不了他。结果 CTO 招了外包,两个月把模块重写并行验证,确认没问题,直接拿他“违规操作生产环境”的理由开掉,还按最低标准赔。

我觉得这事吧,本质不是技术问题,是心态问题。你把系统当人质,老板自然把你当风险源头。技术人的安全感,不该来自“只有我懂”,而是来自:就算别人能接手,也知道我做得又专业又靠谱。

换个角度想,真有本事的人,敢把文档写清楚、流程跑规范,让谁来接盘都觉得轻松。说到底,职场最稳的护身符,从来不是“别人离不开你”,而是“你走到哪儿都有人要你”。

在 LR 字符串中交换相邻字符

昨天晚上十一点多吧,我还在公司楼下抽烟,我们组那个小李突然发微信,说“哥,这题我看着简单,怎么一写就错啊”,我一看题名就笑了,那个……“在 LR 字符串中交换相邻字符”,对吧,就是那种 XL -> LXRX -> XR 这种挪来挪去的,写起来像在挪人,一不小心就把人挪穿墙了。

这题最坑的点是很多人会想:那我就模拟交换呗,循环找 XL 就换、找 RX 就换,直到不动为止……哎你别说,真有人这么干,然后线上直接卡死,字符串一长就跟你日志里刷屏一样,CPU 嗡嗡的。其实你想想,规则已经把“方向”写死了:L 只能往左挪(因为只有 XL -> LX), R 只能往右挪(因为只有 RX -> XR),X 就是空位。你模拟交换,其实是在用蛮力做“位置约束检查”。

所以我一般是这么跟小李说的:别看交换,看“人是谁”和“人能不能到那个位置”。先把所有 X 去掉,剩下的顺序必须一模一样,不然你怎么换都不可能把一个 L 变成 R,对吧。比如 start 去掉 X 是 LRR end 去掉 X 是 RLR,那直接判死刑,别折腾。

然后第二步才是关键:同一个字母在 start 的位置和在 end 的位置,得符合方向。

  • 如果是 L,它只能往左走,所以它在 start 里的下标 必须大于等于 它在 end 里的下标(先在右边,才有机会往左挪过去)。
  • 如果是  R,它只能往右走,所以它在 start 里的下标 必须小于等于 它在 end 里的下标。

就这么两条,基本把题掐死了。实现上我用双指针,两个指针分别在 start/end 上跑,跳过 X,对齐到真正的 L/R 再比。

Java 我给你写一份我常用的,挺短,也不绕:

public class SwapAdjacentInLRString {

    public boolean canTransform(String start, String end) {
        if (start == null || end == nullreturnfalse;
        if  (start.length() != end.length()) returnfalse;

        int n = start.length();
        int i = 0, j = 0;

        while (i < n || j < n) {
            // 跳过空位 X
            while (i < n && start.charAt(i) == 'X') i++;
            while (j < n && end.charAt(j) == 'X') j++;

            // 两边同时走到头,说明都对齐完了
            if (i == n && j == n) returntrue;
            // 只有一边到头,另一边还有 L/R,肯定不行
            if (i == n || j == n) returnfalse;

            char a = start.charAt(i);
            char b = end.charAt(j);

            // 人都不是同一个了,还变啥
            if (a != b) returnfalse;

            // 方向约束:L 只能左移,R 只能右移
            if (a == 'L' && i < j) returnfalse// L 不能从左往右跑
            if (a == 'R' && i > j) returnfalse// R 不能从右往左跑

            i++;
            j++;
        }

        returntrue;
    }

    // 你要本地跑一下就加个 main,别老用脑补…我以前就爱脑补,翻车多了
    public static void main(String[] args) {
        SwapAdjacentInLRString s = new SwapAdjacentInLRString();
        System.out.println(s.canTransform("RXXLRXRXL""XRLXXRRLX")); // true
        System.out.println(s.canTransform("X""L")); // false
    }
}

你看这段代码,实际上干了三件事:一边跳 X、一边对齐  L/R、最后用下标关系卡死方向。很多人会忘了“去掉 X 顺序一致”这个本质,但我们这里其实隐含做了:因为每次对齐都要求 a == b,一旦顺序不同,中间某次就对不上。

还有个小坑我顺嘴说下(别嫌我啰嗦):有的人拿计数器统计 L 数量、R 数量,觉得数量一样就行,这不行的,顺序错了也不行。就像排队,人数一样不代表你能把张三换成李四站到那个位置上,对吧。

反正这题你把它当“交换题”就容易写成模拟,把它当“约束题”就很顺,复杂度 O(n),字符串再长也不怕。行了我先不说了,刚刚外卖到了,等下又凉了我又得骂自己……


高质量原创回顾


中国最难入职的IT公司...


马斯克发私信让美女网红给他生娃,被拒以后切断了网红每两周2.1万美元广告收入?


外包同事参加聚餐,刚到包间门口,就听主管说:都自己人,以后有啥脏活累活都给外包,他们本就是服务咱的,不要不好意思


离职交接后,线上出现bug,接口是自己开发的,n+1补偿被追回了


听说互联网不卡35岁了?


程序员为保饭碗,开始“防御性编程”.....


字节这波操作,直接改变了大家的习惯?


华为员工爆料:OD大部分人是入职即巅峰!D4级,除了升D5时月薪涨了3k,其他时候从来没涨过

图片


别忘了点分享、收藏、在看、点赞哦!


图片

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/193254