月薪 3万但要 996 拼命,月薪1万却能朝九晚五生活规律,这两种工作你会怎么选?
月薪3万,换来996;月薪1万,朝九晚五还能按点吃饭睡觉。你说这题像不像成年人版选择困难症:要钱,还是要命。
评论区也挺真实。有网友说,年轻时咬牙冲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。 第四,别在循环里把“当前值是否还活着”写乱,不然后面判断会飘。