Python技术迷

月薪 3万但要 996 拼命,月薪1万却能朝九晚五生活规律,这两种工作你会怎么选?

月薪3万,换来996;月薪1万,朝九晚五还能按点吃饭睡觉。你说这题像不像成年人版选择困难症:要钱,还是要命。

Image

评论区也挺真实。有网友说,年轻时咬牙冲3万,先把房租、存款、安全感攒出来;也有人直接回一句,班都上成这样了,钱最后大概率是拿去补身体。话糙,但真不假。

我自己的想法更俗一点:得看这3万是不是“真3万”。要是天天待命、周末失踪、手机一响心里就发毛,那它看着是高薪,实际更像打包卖时间。反过来,1万虽然不算多,但作息稳、情绪稳、人还能有点自己的日子,这种班上久了,人味儿都还在。

很多人嘴上选3万,真干两个月,黑眼圈一挂,脾气一炸,回家连说话都嫌累。挣钱当然重要,可班上到最后,别搞成钱进卡里,人先报废。

算法题:小行星碰撞

数组一进来我先不看“碰撞”两个字,先看方向。 一堆数,正数往右飞,负数往左飞。真正会打起来的,只有一种情况:前面那个还在往右,后面这个已经往左。也就是栈顶 > 0,当前值 < 0。别的组合,连架都打不起来。

这题如果你上来就想着两两模拟,代码八成会写拧。因为一次碰撞结束,不代表事完了。一个更大的小行星,可能把前面栈里好几个都撞没。这个味道很像线上排障里那种“看着只改一行,后面连锁反应一串”的问题,第一眼就该往栈上想。

直接上代码,别绕:

from typing import List

classSolution:
defasteroidCollision(self, asteroids: List[int]) -> List[int]:
        stack = []

for x in asteroids:
            alive = True

while alive and x < 0and stack and stack[-1] > 0:
                top = stack[-1]

if top < -x:
                    stack.pop()      # 栈顶小,先炸
continue

if top == -x:
                    stack.pop()      # 同归于尽
                alive = False# 当前这个也没了,或者被挡住了

if alive:
                stack.append(x)

return stack

这段代码关键不在 append,在那个 while。 很多人会写成 if,这个地方一错,后面就全错了。因为当前小行星可能连续碰撞,不是只撞一次就收工。

拿 asteroids = [10, 2, -5] 过一遍:

  • 10 进栈,[10]
  • 2 进栈,[10, 2]
  • -5 来了,先跟 2 撞,2 没了
  • 还没结束,-5 继续跟 10 撞
  • 10 更大,-5 没了
  • 最后剩 [10]

这个过程如果不用栈,代码会写得很碎,还容易漏掉“继续撞”这一步。

再说复杂度。 表面上有 while,很多人会紧张,觉得是不是 O(n^2)。其实不是。每个元素最多进栈一次、出栈一次,总操作数还是线性的,时间复杂度 O(n),空间复杂度 O(n)。这种题就属于典型的“看起来会反复回退,实际上每个对象都只处理有限次”。

这题真正容易错的点我顺手记一下:

第一,只有 stack[-1] > 0 and x < 0 才会碰撞。 第二,相等时两个都消失。 第三,当前值撞完一个之后,可能还要继续撞,所以必须 while。 第四,别在循环里把“当前值是否还活着”写乱,不然后面判断会飘。