职场最恶心的就是这种老员工 让他带新人的时候,重点,细节全部不说,结果转头就去找领导那嚼舌根,告你
最烦的真不是活多,是碰上那种带新人专业户。嘴上答应得挺好,真到教的时候,关键步骤全靠你猜,细节一问就拉脸,跟欠他年终奖似的。
你自己摸索着做吧,他又跑去领导那边开小会:这新人不行,学不会,还不懂尊重前辈。
评论区有人说,这种人不是不会带,是太会算了。还有人更直接:他怕的不是你犯错,是你真学会。
这话我信。很多老员工压根不是经验值高,是信息差捂得紧。表面一副“我也是为你好”,背地里全是小动作。新人最惨,问也挨骂,不问也背锅,活像进了什么职场狼人杀。碰上这种人,别急着内耗,先留痕,少掏心窝子,HR看完这种戏码估计都得翻白眼。
算法题:数据流的中位数
堆里两个数一比,代码看着没毛病,结果一上数据流就开始发飘:前半段越来越大,后半段越来越小,中位数一算还不对。 这种题我一般不先想“怎么求中位数”,我先想一件更实际的事:数据是一条一条进来的,你没法每来一个数就全量排序一遍,那不是算法题,那是拿时间复杂度硬扛。
这题的手感,其实就在两个堆上。
一个大顶堆,专门放“较小的一半”;一个小顶堆,专门放“较大的一半”。这样中位数就很好取了:
如果总数是奇数,让大顶堆多一个元素,中位数就是它的堆顶。 如果总数是偶数,中位数就是两个堆顶的平均值。
这地方我第一眼会先盯住两个约束,不然后面一定乱:
两个堆的元素数量差不能超过 1 大顶堆里的值,必须都小于等于小顶堆里的值
Python 里没有现成的大顶堆,heapq 默认是小顶堆,所以通常把数值取反来模拟。
代码直接看,比讲一堆概念省事:
import heapq
classMedianFinder:
def__init__(self):
self.left = [] # 大顶堆,存较小的一半,实际存负数
self.right = [] # 小顶堆,存较大的一半
defaddNum(self, num: int) -> None:
ifnot self.left or num <= -self.left[0]:
heapq.heappush(self.left, -num)
else:
heapq.heappush(self.right, num)
# 平衡两个堆
if len(self.left) > len(self.right) + 1:
heapq.heappush(self.right, -heapq.heappop(self.left))
elif len(self.right) > len(self.left):
heapq.heappush(self.left, -heapq.heappop(self.right))
deffindMedian(self) -> float:
if len(self.left) > len(self.right):
return float(-self.left[0])
return (-self.left[0] + self.right[0]) / 2.0
拿一组数据走一下:2, 1, 5, 7, 2, 0, 5
来 2,左边[2],中位数2来 1,左边[1],右边[2],中位数1.5来 5,右边多了,挪一个到左边,中位数2后面继续加,始终保持“左边兜底,右边托住”
这个解法的好处不是“优雅”,而是稳。每插入一次,复杂度是 O(log n);取中位数直接看堆顶,就是 O(1)。你要是每次都排序,那插入一条数据就得重新排,性能很快就没法看了。
这题真正容易写错的,不是堆,反而是“平衡”这一步。很多人写完入堆逻辑就觉得结束了,结果两个堆大小失衡,或者左边堆顶比右边还大,中位数自然就脏了。气质。