Python技术迷

现在跳槽别乱要价了,目前薪资基础上10-15%涨幅,最高20%封顶;30%及以上的涨幅是几年前,现在是买方市场,做好降薪心里准备

行情这玩意儿是真变了。前些年大家跳槽张口就想多拿一大截,谈得好像不是工作,是拍卖会。

现在明显不是那个路数了,能在原来基础上往上抬一点就已经算还行,冲太猛,很多时候不是你不优秀,是市场根本不接这个球。

Image

企业现在手里选择多,说白了更敢挑,也更在意你能不能立刻顶上,不太愿意为“预期”买单。

所以这时候还拿着前几年的标准去谈,挺容易把自己谈尴尬。不是劝人认怂,是得先认清现在桌上是谁说了算。很多人不是能力不行,是还没从旧剧本里出来。


算法题:供暖器

半夜刷题最烦的一类,不是不会写,是你明明觉得“排个序再扫一遍”就行,结果边界一多,自己先把自己绕进去了。供暖器 就是这种题。房子一排,供暖器也一排,问最小加热半径要多大,才能把所有房子都罩住。

这题我第一眼就不太信二分答案那套。不是不能做,是有点绕。真正在代码里最顺手的,还是排序 + 双指针。房子和供暖器都排好序,然后让指针一直贴着“离当前房子最近的那个供暖器”往前走。

关键判断就一句:当前供暖器如果没有下一个了,那就只能用它。要是还有下一个,就比较一下当前这个和下一个,哪个离房子更近。只要下一个更近,指针就往前挪。这样每个房子都能找到最近供暖器,它们各自的最短距离里,最大的那个,就是答案。

别小看这个“只往前不回头”。很多人写这题喜欢每个房子都去二分找最近供暖器,也能过,但代码明显碎一点。双指针这里其实更像线上排查时顺着时间线扫日志:前面都看过了,就别反复翻。

直接上代码,我按自己平时的写法收了一版,没整那些花里胡哨的封装:

from typing import List

classSolution:
deffindRadius(self, houses: List[int], heaters: List[int]) -> int:
        houses.sort()
        heaters.sort()

        j = 0
        ans = 0
        m = len(heaters)

for house in houses:
while j + 1 < m and abs(heaters[j + 1] - house) <= abs(heaters[j] - house):
                j += 1

            ans = max(ans, abs(heaters[j] - house))

return ans

拿 houses = [1,2,3,4],heaters = [1,4] 过一遍就很清楚。房子 1 最近的是供暖器 1,距离 0;房子 2 到 1 和 4 的距离分别是 1、2,还是选 1;房子 3 这时候 4 更近,指针往后走;房子 4 距离 0。最后最大距离是 1,所以半径取 1。

这题真正容易错的地方有两个。一个是指针别为每个房子重置,不然就退化了。另一个是比较距离时要写 <= 还是 <,我一般写 <=,让指针在相等时也往后走,逻辑更顺,结果不受影响。

时间复杂度是排序的 O(n log n + m log m),扫一遍是 O(n + m)。空间复杂度基本就是排序带来的那点开销。

这种题做完其实没什么玄学,就是一句话:别替每个房子重新找最近供暖器,最近的位置本来就是沿着数组单调往前走的。