程序员老鬼

某大厂员工:选leader-定要选有家庭财富相对自由的中年人,如果你的leader是个奋斗b、光棍,那你注定就是他的垫脚石~

刚看到个贴子,大意是说选leader一定要挑有家庭底气、生活稳定的中年本地人,千万别遇上那种拼命三郎型单身奋斗B,不然下属就成耗材了。

Image

网友们的回帖很多都在吐槽“奋斗B压榨人”,我是理解的,这类领导确实容易把团队当加班机器,因为他自己没牵挂、没退路。

但换个角度想,leader有没有家庭财富,不等于他是不是好领导,关键还是格局和心态。

从我的角度看,一个成熟的领导往往更懂得平衡,更愿意带团队成长,而不是只顾自己往上爬。但年轻拼命型也不是全坏,有的只是缺经验,做事太冲。

不过话说回来,选领导确实是职场最现实的课题。能遇到心态稳、看得远的人,是运气;遇不到,也要学会保护自己,不当谁的垫脚石。【备注:文末可领最新资料】

面试题:变更性别

有这么个小算法题,叫“变更性别”。咱先自己给它补个比较接地气的题目描述,不然光看四个字有点懵。

假设系统里用一串字符来表示一排人的性别:

  • 'M' 代表男性(male)
  • 'F' 代表女性(female)

比如:"MFMFFM" 就表示一排 6 个人,男女混着来。

现在需求是:把这串人的性别全部反转:

  • M 变成 F
  • F 变成 M

所以 "MFMFFM" 变完就应该是 "FMFMMF"。

输入输出你可以想象成这样(伪格式):

  • 输入:一个只包含 M 和 F 的字符串 s
  • 输出:一个同长度的新字符串,把每个字符都反过来

就这么简单的小需求,但特别适合拿来练手:字符串遍历、时间复杂度、空间优化这些,都能顺带说一圈。

思路就一件事:从头走一遍,边看边改

这个题目最直接的想法就是:从左到右把字符串扫一遍,看见啥改啥:

  1. 建一个可修改的容器:比如 char[] 或者 StringBuilder

  2. 遍历原字符串:

  • 如果当前字符是 'M',放 'F'
  • 如果当前字符是 'F',放 'M'
  • 如果碰到别的字符(健壮一点嘛),就原样放回去
  • 最后把容器变回字符串丢出去

  • 时间复杂度很一眼:

    • 扫一遍字符串,长度是 n,就是 O(n)

    空间复杂度看你怎么写:

    • 用 StringBuilder / 新的 char[],是 O(n)
    • 如果允许“就地修改”(比如入参给的是 char[] 而不是 String),可以做到 O(1) 额外空间

    Java 里 String 不可变,所以正常面试写法都是新建一个 StringBuilder,又清晰又安全。

    用 Java 写一版最常规实现

    先来一个最常规、可读性比较好的版本:

    publicclassChangeGender{

    /**
         * 把字符串里的 M/F 性别反转
         * 如果有不是 M/F 的字符,原样保留
         */

    publicstatic String changeGender(String s){
    if (s == null || s.length() == 0) {
    return s; // 直接返回,省事
            }

            StringBuilder sb = new StringBuilder(s.length());
    for (int i = 0; i < s.length(); i++) {
    char c = s.charAt(i);
    if (c == 'M') {
                    sb.append('F');
                } elseif (c == 'F') {
                    sb.append('M');
                } else {
    // 健壮一点,遇到奇怪字符就别崩,先原样保留
                    sb.append(c);
                }
            }
    return sb.toString();
        }

    publicstaticvoidmain(String[] args){
            String s1 = "MFMFFM";
            String s2 = "MMMM";
            String s3 = "FFFF";
            String s4 = "";       // 空串
            String s5 = null;     // null

            System.out.println(changeGender(s1)); // 输出:FMFMMF
            System.out.println(changeGender(s2)); // 输出:FFFF
            System.out.println(changeGender(s3)); // 输出:MMMM
            System.out.println(changeGender(s4)); // 输出:空串
            System.out.println(changeGender(s5)); // 输出:null
        }
    }

    你看,逻辑其实就一句话:按规则把每个字符替换掉,剩下的就是 Java 的“礼节性写法”:判空、主函数里随便测几个例子。

    你要是去面试,面试官一般会顺手多问两句,这里顺带帮你把话术准备好:

    1. 时间复杂度是多少?为什么?

    • 一次 for 循环,从头走到尾,长度是 n,所以是 O(n)。
    • 里面每一步就是常数时间的判断和 append,不会更高。
  • 空间复杂度呢?能不能再省一点?

    比如:

    publicstaticvoidchangeGenderInPlace(char[] chars){
    if (chars == null) {
    return;
        }
    for (int i = 0; i < chars.length; i++) {
    if (chars[i] == 'M') {
                chars[i] = 'F';
            } elseif (chars[i] == 'F') {
                chars[i] = 'M';
            }
        }
    }
    • 现在写法用到了 StringBuilder,存了一份新字符串,是 O(n) 额外空间。
    • 如果把入参换成 char[] chars,就可以原地改,空间复杂度降成 O(1)。
  • 大小写问题要不要考虑?

    • 如果题目说只会给大写 M/F,那就不用管。
    • 要是你想写得更“人性化”,可以把 'm' 当成 'M'、'f' 当成 'F',一起处理掉,也就是多做两次判断而已。
  • 如果以后性别不止两种怎么办?

    • 这就不是简单二元翻转了,规则就会复杂很多,比如可能就变成“根据映射表替换”那种逻辑。
    • 这个题目当前就当成二值翻转来看就好了,思想上你可以类比“0/1 取反”。

    把它当成“0/1翻转”练习也行

    其实你把 'M' 当成 '0','F' 当成 '1',这题就跟“给定一个只包含 0 和 1 的字符串,把所有位取反”完全一样:

    • 0 -> 1
    • 1 -> 0

    很多算法题会用这个形式出,你脑子里可以悄悄把它们归到一个“模式”里:

    遍历 + 按规则映射

    以后只要再遇到类似:

    • 大写变小写,小写变大写
    • 正负号反转 + ↔ -
    • 某个固定的字符映射关系

    你都可以下意识想到:行,我就按这个套路来,for 一遍搞定。

    -END-

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

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