程序员老鬼

hr筛选简历约面试,其实粗暴到只看年龄、学历、期望薪资、工作经历、跳槽频次等

前两天在公司茶水间碰到小王,他刚面完一家大厂,脸色挺郁闷的。说他那份简历,HR可能连标题都没看完就直接Pass了——理由很简单,年龄偏大、学历一般、期望薪资高、不是同行、还跳槽频繁,这几个标签一打,三秒就判死刑。

Image

听得我这个老程序员脑子里都自动浮现出一个if-else筛选逻辑:

if (age > 35 || !matchIndustry || salary > budget || jumpTooMuch) return"PASS";

就这么粗暴😅。

其实咱做技术的都知道,简历只是个入口,你写得多漂亮,系统也许第一轮就按规则刷掉了。那种机器筛选,甚至比我用grep找日志还快。想想有点心酸,但这也是现实——HR KPI压着,他们看不到你在代码里熬夜踩的坑,也不会关心你bug背后的优化思路。

所以啊,别只想着“技术牛逼就够了”,投简历前先想想怎么绕过那三秒钟的if判断,不然面都见不到。【备注:文末可领最新资料】

算法题:132 模式

昨晚十一点半,我在公司楼下吹了会儿风,手机刷到个老朋友问的题,说是“132 模式”,我当时还愣了下,啥叫132来着…哦对,就是找三个下标 i<j<k,让 nums[i] < nums[k] < nums[j]。听着有点拗口对吧,但这个形状很好记:先小、再大、再夹个中间的。

你可以想象股价曲线,先有个低点 a₁,再冲到高点 a₂,然后回落一点变成 a₃,但这 a₃ 还比 a₁高。只要存在这种“低—高—中”的顺序,就算找到了。暴力三重循环肯定能做,但…你们懂的,n 到了十万,直接原地升天。

我一开始也想用“前缀最小值+中间扫描”,结果越写越乱。后来想起一个更顺手的思路:从右往左扫,用一个栈去维护一个“可能当中间值的递减序列”,再用一个变量 third 去记住“已经确认能当 a₃ 的最大值”。逻辑大概是这样:我往左看一个数 nums[i],如果它比 third 还小,那不就有 a₁ < a₃ 的条件了嘛?而栈里放的那些比当前大的值,其实更像是候选的 a₂。期间只要我发现右边有不少小于这些候选 a₂ 的数字,就把它们弹出来作为更好的 third。说得可能有点绕…等下我贴代码。

publicclassPattern132{
publicbooleanfind132pattern(int[] nums){
if (nums == null || nums.length < 3) returnfalse;
        java.util.Deque<Integer> stack = new java.util.ArrayDeque<>();
// third 表示当前能当 "2" 的最好人选(也就是 a3),尽量大但必须 < 某个 a2
int third = Integer.MIN_VALUE;

// 从右往左走,右边世界更完整
for (int i = nums.length - 1; i >= 0; i--) {
int x = nums[i];
// 如果当前数已经比 third 小,说明存在 a1 < a3,且之前见过的某个 a2 > a3
if (x < third) returntrue;

// 维护一个严格递减栈,弹出所有 < x 的值,
// 被弹出来的都是比当前 x 小、且之前站在某个更大的 a2 左边的家伙,
// 它们可以当更大的 third(更接近 a2,更容易满足夹在中间)
while (!stack.isEmpty() && x > stack.peek()) {
                third = Math.max(third, stack.pop());
            }
// x 入栈当候选 a2
            stack.push(x);
        }
returnfalse;
    }

// 小测一下
publicstaticvoidmain(String[] args){
        Pattern132 p = new Pattern132();
        System.out.println(p.find132pattern(newint[]{1, 2, 3, 4}));      // false
        System.out.println(p.find132pattern(newint[]{3, 1, 4, 2}));      // true -> 1,4,2
        System.out.println(p.find132pattern(newint[]{-1, 3, 2, 0}));     // true -> -1,3,2
        System.out.println(p.find132pattern(newint[]{1, 0, 1, -4, -3})); // false
    }
}

就是那个…从右往左时,栈里始终是个严格递减的候选 a₂ 列表。只要遇到一个更大的 x,就把所有比 x 小的弹走,这些被弹走的家伙,本质是“处在某个更大 a₂ 左边的数”,它们都能当 a₃,我用 third 记一个最大的,这样更容易让未来某个更小的 a₁ 成功夹住:a₁ < third < 现在或未来的某个 a₂。等我看到一个 x 比 third 还小,结构立马闭环。时间 O(n),空间 O(n),还挺香的。

有朋友会问:third 为啥取最大?因为 a₃ 越接近 a₂,越容易被更多更小的 a₁ 命中;如果 third 太小,能命中的 a₁ 就少。还有就是别从左往右硬凑,那个要维护的关系反而更绕。还有还有,整型范围…我们用的是 int,题目也就 int,没啥溢出问题,放心。

实在不放心的话,自己加两组边界:全降序(一定 false)、有重复元素(不影响,因为不要求严格不等的下标值,要求的是数值严格大小关系)。

-END-

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

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