程序员老鬼

hr好像对我有意思,咋办。。

前两天在公司楼下抽烟,有个哥们跟我说他面了一家小厂,技术面还行,就是HR那环节怪怪的🤔。

项目聊完,HR突然开始问他是不是单身,还说面试完能不能一起吃个饭,这…作为程序员的直觉告诉我,这个分支逻辑有点出乎预料啊。

Image

一般HR流程就是确认期望薪资、到岗时间之类的,跑去问感情状态,这不就像在生产环境突然多了个if (isSingle)的条件分支一样,风险未知啊😂。他担心拒绝了就被挂简历,我只能安慰说,这种非技术性的case,基本不会写进淘汰策略里。

不过从我多年写代码和踩坑的经验看,和业务(面试流程)无关的异常分支,能避就避,万一真的影响了结果,那这家公司本身的系统设计也不够健壮。反正我劝他先静观其变,别在还没上线前就自我rollback了😏。【备注:文末可领最新资料】

算法题:用最少数量的箭引爆气球

昨晚十一点多,我在小区楼下等外卖,风有点大…手机上有人问我那个“用最少箭把气球都扎爆”的题怎么写,我一边哈气一边想,这玩意儿别被题目吓到,逻辑其实挺朴素的。

就是有一堆区间 balloons[i] = [start, end],一箭沿着 x 轴竖着射,能炸掉所有横坐标落在这条竖线上的气球。问最少射几箭。听着像区间覆盖是不是?对,就是那个味儿。

我当时跟外卖小哥说…呃不对,跟群里小李说:别瞄左边,瞄最右能射到的点。更具体点——把气球按右端点从小到大排好队,先把第一只气球的右端点当成“箭位”。后面的气球,只要起点 ≤ 这个箭位,就顺带炸了;一旦遇到起点 > 箭位,就说明这支箭不够用了,得再来一箭,并把箭位更新成当前气球的右端点。为啥这样对?因为右端点越靠左,你的这支箭就越“保守”,能兼容后面尽可能多的气球,典型区间调度那套思路,贪心得有理。

我刚才在楼门口蹲着就敲了下,别嫌丑,能过就行:

import java.util.*;

publicclassMinArrows{
publicintfindMinArrowShots(int[][] points){
if (points == null || points.length == 0) return0;
// 按右端点升序,注意别用 a[1]-b[1] 防溢出
        Arrays.sort(points, (a, b) -> {
if (a[1] == b[1]) return Integer.compare(a[0], b[0]);
return Integer.compare(a[1], b[1]);
        });

int arrows = 1;
long arrowPos = points[0][1]; // 用 long 防 int 边界奇怪用例
for (int i = 1; i < points.length; i++) {
if (points[i][0] > arrowPos) {
                arrows++;
                arrowPos = points[i][1];
            }
// 否则就被当前这支箭顺带炸了,啥也不用干
        }
return arrows;
    }

// 小测一下
publicstaticvoidmain(String[] args){
        MinArrows s = new MinArrows();
        System.out.println(s.findMinArrowShots(newint[][]{
            {10,16},{2,8},{1,6},{7,12}
        })); // 2
    }
}

就是那个…排序别用减法比较,数据范围大了会溢出;还有空数组直接 0,别徒增一箭。复杂度呢,排序是 O(n log n),一趟扫描 O(n),面试官爱听这个。对了,若你把“箭位”写成当前能覆盖区间的最小右端,本质一样。

-END-

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

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