某HR:有个候选人本来已经准备给他发 offer了,结果他大嘴巴离职前到处说,导致他同事打电话到我们公司说他人品很差,最终被放弃了
一个HR说,本来有个候选人都快走到发 offer 这一步了,结果人还没正式离职呢,嘴先飞出去了。到处跟原公司同事说自己要去哪、拿了啥机会,估计还挺得意。
然后就尴尬了。
他同事直接打电话到新公司,说这人平时人品不咋样。HR一听,offer 也不发了,直接放弃。
这事听着像八卦,其实挺吓人的。职场里最怕的不是你换工作,是你还没落地就开始满世界广播。尤其离职前,关系没处理好,尾巴没收干净,随便一个人背后补一刀,你前面面试跑的流程全白搭。
有些话真不是不能说,是别太早说。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
下车点不占座。
这个细节错了,后面写得再工整也没用。