公司来了一个女开发,感觉我又行了~
刚看到个贴子,说公司新来个女后端,结果有男同事突然信心爆棚,说“感觉我又行了”。
其实这事本质还是在惊讶女生做后端的少。行业确实如此,后端女生本来就稀缺,但这和能力强弱没半点关系,关键还得看技术栈和项目实战能力,性别在代码面前真的没啥用。
网友们的回复里,说女生做后端能打得飞起,这我完全相信,毕竟写代码从来不分性别,键盘面前都是同一个bug。反倒是有些人一看到女同事就开始“自信回升”,这心态有点迷,像打游戏遇到女号以为是送分,其实分分钟被人反杀。
我的看法是,团队里来了高手就要多学点,别光想着“我行了”,而是“我们能不能一起把项目搞定”。【备注:文末可领最新资料】
算法题:职员招聘人数
朋友圈有人又在吐槽那种“职员招聘人数”算法题,你们知道吧?就是那种公司有一堆岗位,每个岗位要招多少人,每个人还只能干一种岗位,怎么安排能让所有岗位都招满,面试里老出现。结果群里有个朋友还问我,这种题用Java咋写,说实话,这年头连面试题都快成家常便饭了。
比如说啊,你公司有五个岗位:开发、测试、运营、设计、销售,然后每个岗位要的人数不一样。你手里一堆简历,每个人只能被录用一次,有的人会开发,有的人会设计,有的啥都会,但只能选一个方向。题目就是让你算,最多能安排多少个人进公司,而且所有岗位尽量都招满。
其实这个问题,生活里也挺常见的,尤其互联网公司,每年春招秋招,那招聘表都快成Excel大比拼了。前两年我们组那个小李就碰到过,老板说开发要5个人,测试要3个人,简历放那,HR还问小李“你能不能写个算法自动排一排?”小李那会愣是熬夜撸了个Java版出来,第二天还迟到了,真拼。
你要是做过LeetCode,肯定会想到最大匹配、二分图那一套,但说实话,面试官一般也不要求你非得写多复杂,能用个“贪心+回溯”搞定,大多数公司就给过了。简单点讲,就是一个岗位一个岗位试,把能匹配的人塞进去,塞不下了再回退找下一种分配方式。
实际场景下,比如有个人既能开发也能测试,你先让他去开发,如果开发满了再考虑让他去测试。所有可能都遍历一遍,看哪种方案能招到最多人。代码实现其实挺啰嗦,但逻辑还是很清楚的。
给你们看看当时小李咋写的,不夸张,这种代码虽然看着“原始”,但可维护性杠杠的。
import java.util.*;
publicclassRecruitSolution{
// 岗位列表,比如“开发”“测试”
private List<String> positions;
// 每个岗位需要多少人
private Map<String, Integer> needCount;
// 每个人能干哪些岗位
private Map<String, List<String>> candidateAbility;
// 记录已经分配的人
private Set<String> usedCandidate = new HashSet<>();
// 记录当前岗位分配结果
private Map<String, List<String>> currentAssign = new HashMap<>();
privateint maxRecruit = 0;
publicRecruitSolution(List<String> positions, Map<String, Integer> needCount, Map<String, List<String>> candidateAbility){
this.positions = positions;
this.needCount = needCount;
this.candidateAbility = candidateAbility;
for (String pos : positions) {
currentAssign.put(pos, new ArrayList<>());
}
}
publicintsolve(){
backtrack(0);
return maxRecruit;
}
privatevoidbacktrack(int posIdx){
if (posIdx == positions.size()) {
// 统计当前总招到人数
int sum = 0;
for (String pos : positions) sum += currentAssign.get(pos).size();
if (sum > maxRecruit) maxRecruit = sum;
return;
}
String pos = positions.get(posIdx);
int need = needCount.get(pos);
List<String> canChoose = new ArrayList<>();
// 找出所有能干这个岗位且还没被选过的人
for (String cand : candidateAbility.keySet()) {
if (!usedCandidate.contains(cand) && candidateAbility.get(cand).contains(pos)) {
canChoose.add(cand);
}
}
// 枚举分配方式
dfsAssign(canChoose, 0, need, posIdx, new ArrayList<>());
}
privatevoiddfsAssign(List<String> canChoose, int idx, int left, int posIdx, List<String> picked){
if (left == 0 || idx == canChoose.size()) {
// 填充岗位,继续下一个岗位
String pos = positions.get(posIdx);
currentAssign.get(pos).addAll(picked);
for (String c : picked) usedCandidate.add(c);
backtrack(posIdx + 1);
for (String c : picked) usedCandidate.remove(c);
for (String c : picked) currentAssign.get(pos).remove(c);
return;
}
// 不选当前人
dfsAssign(canChoose, idx + 1, left, posIdx, picked);
// 选当前人
picked.add(canChoose.get(idx));
dfsAssign(canChoose, idx + 1, left - 1, posIdx, picked);
picked.remove(picked.size() - 1);
}
// 用法演示
publicstaticvoidmain(String[] args){
List<String> positions = Arrays.asList("开发", "测试", "设计");
Map<String, Integer> needCount = new HashMap<>();
needCount.put("开发", 2);
needCount.put("测试", 1);
needCount.put("设计", 1);
Map<String, List<String>> candidateAbility = new HashMap<>();
candidateAbility.put("张三", Arrays.asList("开发", "设计"));
candidateAbility.put("李四", Arrays.asList("开发"));
candidateAbility.put("王五", Arrays.asList("测试", "开发"));
candidateAbility.put("赵六", Arrays.asList("设计"));
RecruitSolution rs = new RecruitSolution(positions, needCount, candidateAbility);
System.out.println("最大可招人数:" + rs.solve());
}
}
这种题其实挺考耐心的,尤其你脑子里还想着外卖啥时候到,群里还在刷消息。小李写到一半还跟我吐槽:“哥,这比实际排班累多了。”不过你要真搞懂了,以后再遇到类似“分配问题”“最大匹配”,就不会懵了。
实际工作里,HR要的是结果,老板关心的是“是不是岗位都满了”,你要算法写得再花哨,没人管你底层怎么跑,能出结果就行。反正下次再有小伙伴问,我就直接甩这个Java代码过去,省得在群里一句一句解释,太费嗓子了...
-END-
我为大家打造了一份RPA教程,完全免费:https://www.songshuhezi.com/rpa.html