某大厂员工:选leader-定要选有家庭财富相对自由的中年人,如果你的leader是个奋斗b、光棍,那你注定就是他的垫脚石~
刚看到个贴子,大意是说选leader一定要挑有家庭底气、生活稳定的中年本地人,千万别遇上那种拼命三郎型单身奋斗B,不然下属就成耗材了。
网友们的回帖很多都在吐槽“奋斗B压榨人”,我是理解的,这类领导确实容易把团队当加班机器,因为他自己没牵挂、没退路。
但换个角度想,leader有没有家庭财富,不等于他是不是好领导,关键还是格局和心态。
从我的角度看,一个成熟的领导往往更懂得平衡,更愿意带团队成长,而不是只顾自己往上爬。但年轻拼命型也不是全坏,有的只是缺经验,做事太冲。
不过话说回来,选领导确实是职场最现实的课题。能遇到心态稳、看得远的人,是运气;遇不到,也要学会保护自己,不当谁的垫脚石。【备注:文末可领最新资料】
面试题:变更性别
有这么个小算法题,叫“变更性别”。咱先自己给它补个比较接地气的题目描述,不然光看四个字有点懵。
假设系统里用一串字符来表示一排人的性别:
'M'代表男性(male)'F'代表女性(female)
比如:"MFMFFM" 就表示一排 6 个人,男女混着来。
现在需求是:把这串人的性别全部反转:
M变成FF变成M
所以 "MFMFFM" 变完就应该是 "FMFMMF"。
输入输出你可以想象成这样(伪格式):
输入:一个只包含 M和F的字符串s输出:一个同长度的新字符串,把每个字符都反过来
就这么简单的小需求,但特别适合拿来练手:字符串遍历、时间复杂度、空间优化这些,都能顺带说一圈。
思路就一件事:从头走一遍,边看边改
这个题目最直接的想法就是:从左到右把字符串扫一遍,看见啥改啥:
建一个可修改的容器:比如
char[]或者StringBuilder遍历原字符串:
如果当前字符是 '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 的“礼节性写法”:判空、主函数里随便测几个例子。
你要是去面试,面试官一般会顺手多问两句,这里顺带帮你把话术准备好:
时间复杂度是多少?为什么?
一次 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 -> 11 -> 0
很多算法题会用这个形式出,你脑子里可以悄悄把它们归到一个“模式”里:
遍历 + 按规则映射
以后只要再遇到类似:
大写变小写,小写变大写 正负号反转 +↔-某个固定的字符映射关系
你都可以下意识想到:行,我就按这个套路来,for 一遍搞定。
-END-
我为大家打造了一份RPA教程,完全免费:songshuhezi.com/rpa.html