实习工资发600,这已经不是打工了,这像公司拿你练手。

本来一个月才2500,已经是“饿不死但也别想活舒服”的档位了,结果还能给人少算一千多,最后到账600多,谁看了不脑门发麻。更离谱的是下个月也没正常,才发1800多。前面刚经历一波裁实习生,80%的人说没就没,剩下这批又被拖着不转正,工资还跟开盲盒一样,搁谁身上都得窝火。
有网友说,这种公司就是把实习生当临时耗材;也有人说,财务一开始不认账那下,味儿就已经出来了。最气人的还不是钱少,是你拿着劳动换来的东西,人家还能装没看见。最后靠截图把账掰正了,钱是补回来了,但那股恶心劲儿,真能记好几年。
算法题:每日温度
聊完闹心事,换个脑子。栈里塞了一串温度,这道算法题很多人第一眼就嫌它“像模板题”。真上手一写,最容易错的地方反而不是单调栈本身,而是你到底存什么、什么时候出栈、答案在谁身上填。
“每日温度”这题,给你一个数组,temperatures[i] 表示第 i 天温度,要求你算出每一天还要等几天才会出现更高温度。等不到就填 0。
这题我一般不先盯着“找下一个更大元素”这句标准描述,我先看结果怎么落。比如:
temperatures = [73, 74, 75, 71, 69, 72, 76, 73]
- 第 0 天是 73,后面第 1 天 74 比它高,所以答案是 1。
- 第 2 天是 75,得等到第 6 天 76,答案是 4。
- 第 6 天后面没更高的,答案就是 0。
这种题暴力写法很直接,双层循环挨个往后找:
def daily_temperatures_v1(temperatures):
n = len(temperatures)
ans = [0] * n
for i in range(n):
for j in range(i + 1, n):
if temperatures[j] > temperatures[i]:
ans[i] = j - i
break
return ans
代码没毛病,但时间复杂度是 O(n^2)。数据一大,这种写法跑起来就肉眼可见地慢。
真正该上的,是单调栈。
这里栈里别存温度值,存下标。这个细节挺关键。因为最后要填的是“间隔几天”,你只存温度,后面还得想办法找位置,等于又给自己加活。
思路其实就一句话:栈里维护一批“还没找到更高温度的下标”,并且这些下标对应的温度从栈底到栈顶递减。
当前温度一旦比栈顶温度高,说明栈顶这天终于等到答案了,直接出栈并计算天数差。
def daily_temperatures(temperatures):
n = len(temperatures)
ans = [0] * n
stack = [] # 存下标,不存温度
for i, temp in enumerate(temperatures):
while stack and temperatures[stack[-1]] < temp:
prev = stack.pop()
ans[prev] = i - prev
stack.append(i)
return ans
拿 73, 74, 75, 71 这段看就很顺。
- 先压
0。
- 看到
74,比 73 大,0 出栈,ans[0] = 1。
- 看到
75,1 再出栈,ans[1] = 1。
- 看到
71,比 75 小,先压栈等着。
后面谁能把它弹出来,谁就是它右边第一个更高温度。
这题的味道就在这:每个元素最多进栈一次、出栈一次,所以总复杂度是 O(n),不是 while 看着吓人就真比双循环更慢。很多人刚学这类题,最容易在这儿犯嘀咕。
再补两个容易写别扭的点。
第一个,比较条件要写 >,对应代码里就是:
temperatures[stack[-1]] < temp
题目要的是“更高温度”,不是“大于等于”。相等不能出栈。
第二个,遍历结束后,栈里剩下的那些下标不用管,答案本来就该是 0。别再多写一段收尾逻辑,把简单题写复杂了。
这题背后其实就是一种很常见的处理方式:当前位置来了,不急着算自己,先看看能不能顺手把前面那些“悬而未决”的位置结掉。这类数据结构和解题思路,在云栈社区的算法板块里能找到更多深入的讨论和变式题解析。无论是实习的烦恼还是刷题的困惑,多交流总归能找到些共鸣和思路。