hr怼41岁应聘者,都这年纪了还乱投简历。。
刚刷到个贴子,说一个HR直接怼41岁的应聘者“都这年纪了还乱投简历”,结果对方是海归设计师,当场反怼,HR秒怂。😅
网友们也吐槽得好,问题的根本不在“年纪”,而在HR眼里的“模板化”筛人方式,活脱脱就是“条件表格里活着的人”,看不到人的真正价值。
说到底,年龄不是原罪,歧视才是。【备注:文末可领最新资料】
算法题:最大相等频率
突然微信上有人问我算法题,“最大相等频率”,整得我脑子嗡嗡的。你说正常人谁能大晚上琢磨这玩意儿啊?不过他那口气还挺急,我就硬着头皮给他捋了捋,你们要不听听,看有没有哪里说错了哈。
先别着急上来就看代码,我觉得这题你得先理清楚到底问的啥。大概意思就是——有一个整数数组嘛,你得找一个最短的前缀,把里面的数删掉几个也行,但最多只能删一个数,然后剩下那些数的出现频率都要一样。就是比如出现了3个2,3个1,3个5,或者4个啥,4个啥,都一样,这样就可以了。问你最长能到多少个?
你们知道吧,这题说简单也简单,说难也烦人。我当时在沙发上愣了得有十分钟,差点都想直接说“不会”。不过其实吧,思路很朴素。你得考虑,每加一个数进来,频率就变嘛,是不是?你得随时知道每个数出现了多少次,然后频率又分布成啥样。你们要是做过LeetCode那种“桶排序”或者用哈希表统计频率的题,基本上就是那套路。
哦对了,我那会儿正好手边有电脑,我就直接写了个Java版的,大家都能看得懂的那种哈。核心就是两个Map,一个记录每个数字出现多少次,还有一个记录出现频率为x的数有多少个。别急,我敲一段代码你们随便看看:
publicintmaxEqualFreq(int[] nums){
Map<Integer, Integer> countMap = new HashMap<>();
Map<Integer, Integer> freqMap = new HashMap<>();
int res = 0;
int maxFreq = 0;
for (int i = 0; i < nums.length; i++) {
int num = nums[i];
int prevCount = countMap.getOrDefault(num, 0);
if (prevCount > 0) {
freqMap.put(prevCount, freqMap.get(prevCount) - 1);
if (freqMap.get(prevCount) == 0) freqMap.remove(prevCount);
}
int newCount = prevCount + 1;
countMap.put(num, newCount);
freqMap.put(newCount, freqMap.getOrDefault(newCount, 0) + 1);
maxFreq = Math.max(maxFreq, newCount);
int total = i + 1;
// 几种情况能成立
if (
maxFreq == 1 || // 都是只出现一次
(freqMap.get(maxFreq) * maxFreq + freqMap.get(maxFreq - 1) * (maxFreq - 1) == total && freqMap.get(maxFreq) == 1) ||
(freqMap.get(1) == 1 && freqMap.get(maxFreq) * maxFreq + 1 == total)
) {
res = total;
}
}
return res;
}
哎你们别嫌我啰嗦啊,这里面几个地方容易写错。比如那个判断条件,刚开始我还写乱了,结果一跑,样例就不对。我解释下哈:
第一种是所有数都只出现一次,这个不用多说。 第二种情况是,比如大部分都出现maxFreq-1次,只有一个多出来的,像3,3,2,2,1,1,1这种,你把那个1删了就行。 还有就是,大部分都出现maxFreq次,有一个只出现1次,比如1,2,2,3,3,3这种,你把那个1删了也OK。
反正就是不停往前推,最后哪个前缀合法,长度最长就记下来。唉,我老婆还催我睡觉呢,我还得跟她解释“为什么一直盯着电脑”。
要说心得的话,就是这题真的挺考你细心。那天要不是咖啡喝多了,我都坚持不下去——反正啊,做算法题其实和生活很像,边走边调整。你看昨天我还跟小李聊这个,他说最怕这种边界条件的题,一不小心就漏了个角。
写完我测了下,LeetCode全过,心情还不错。
-END-
我为大家打造了一份RPA教程,完全免费:https://www.songshuhezi.com/rpa.html