Python技术迷

某HR:有个候选人本来已经准备给他发 offer了,结果他大嘴巴离职前到处说,导致他同事打电话到我们公司说他人品很差,最终被放弃了

一个HR说,本来有个候选人都快走到发 offer 这一步了,结果人还没正式离职呢,嘴先飞出去了。到处跟原公司同事说自己要去哪、拿了啥机会,估计还挺得意。

然后就尴尬了。

他同事直接打电话到新公司,说这人平时人品不咋样。HR一听,offer 也不发了,直接放弃。

Image

这事听着像八卦,其实挺吓人的。职场里最怕的不是你换工作,是你还没落地就开始满世界广播。尤其离职前,关系没处理好,尾巴没收干净,随便一个人背后补一刀,你前面面试跑的流程全白搭。

有些话真不是不能说,是别太早说。offer 没到手、入职没完成、试用期没坐稳,嘴巴还是先关一关吧。打工人找工作已经够难了,别最后栽在自己嘴快上。

算法题:拼车

拼车这题,坑不在算法,在下车点

trips = [[2,1,5],[3,3,7]],capacity = 4

这组数据一跑,车在位置 3 的时候直接爆了。 不是路线复杂,也不是要真模拟一辆车开来开去,这题第一眼就别往“车怎么走”上想。

它问的是:任何一个位置,车上的人数有没有超过容量。

每个行程长这样:

[num, start, end]

意思是从 start 上 num 个人,到 end 下车。

这里有个很容易写错的点:end 这个位置,乘客已经下车了,不应该继续占座。

所以:

diff[start] += num
diff[end] -= num

不是 end + 1。

这地方我一般会直接用差分数组,不会老老实实一段一段路去加。因为每个行程影响的是一个区间:从上车点开始人数增加,到下车点人数减少。

代码可以这么写:

defcan_pool(trips, capacity):
    farthest = 0

for people, start, end in trips:
        farthest = max(farthest, end)

    seats_change = [0] * (farthest + 1)

for people, start, end in trips:
        seats_change[start] += people
        seats_change[end] -= people

    in_car = 0

for pos in range(farthest + 1):
        in_car += seats_change[pos]

if in_car > capacity:
returnFalse

returnTrue

拿刚才那组数据走一遍:

print(can_pool([[2, 1, 5], [3, 3, 7]], 4))

位置 1 上来 2 个人,车上 2 个。 位置 3 又上来 3 个,车上变 5 个。 容量只有 4,所以返回 False。

再看这一组:

print(can_pool([[2, 1, 5], [3, 5, 7]], 3))

很多人第一次看会觉得危险:前一批 2 人到 5,下一个 3 人也从 5 开始。

但 5 这个点,前一批已经下车了。

差分里就是:

seats_change[1] += 2
seats_change[5] -= 2

seats_change[5] += 3
seats_change[7] -= 3

同一个位置先减后加,最后车上人数是 3,不超载。

这题如果用暴力也能写:

defcan_pool_slow(trips, capacity):
    road = [0] * 1001

for people, start, end in trips:
for pos in range(start, end):
            road[pos] += people

if road[pos] > capacity:
returnFalse

returnTrue

注意这里是 range(start, end),不是 range(start, end + 1)。

暴力版本能过一些数据,但我不太喜欢。因为它把“区间变化”硬写成了“逐点刷人数”,题目一变大,马上就难看。

差分的写法更像是在记账:

上车点,欠容量一笔。 下车点,把这笔还掉。

最后从左到右扫一遍,看账上有没有哪一刻爆掉。

再补一个边界判断,有些代码喜欢提前写死数组长度 1001,因为题目里位置范围可能给得比较小。但平时写业务脚本我不爱这么干,除非范围特别明确。直接按最大下车点开数组,少一点魔法数字,也少一点以后改题时被自己坑。

这题真正要记住的就一行:

diff[start] += people
diff[end] -= people

下车点不占座。

这个细节错了,后面写得再工整也没用。