程序员老鬼

公司来了一个女开发,感觉我又行了~

刚看到个贴子,说公司新来个女后端,结果有男同事突然信心爆棚,说“感觉我又行了”。

Image

其实这事本质还是在惊讶女生做后端的少。行业确实如此,后端女生本来就稀缺,但这和能力强弱没半点关系,关键还得看技术栈和项目实战能力,性别在代码面前真的没啥用。

网友们的回复里,说女生做后端能打得飞起,这我完全相信,毕竟写代码从来不分性别,键盘面前都是同一个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

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