大厂离职后,签好了竞业协议,天天发朋友圈在国外旅游,原公司HR立即让公司停止发放竞业补偿金,告知不竞业了!
刚看到个贴子,说有网友离职签了竞业,结果天天在国外旅游发圈,原公司HR一看立马停发补偿金,说她“不竞业了”。
我觉得关键点不是旅不旅游,而是有没有违反竞业的实质约定。
网友回帖有说“HR小题大做”“人家去哪玩关你啥事”,但说句实话,竞业协议本质上就是钱换束缚,你收了人家的补偿,就要按规则来,这是契约精神。你天天晒自由,HR当然怀疑你要么有收入来源、要么不缺这点钱,那人家反应也正常。
换个角度讲,口头承诺在职场那是真不靠谱的,尤其牵涉到钱。任何跟公司对接的事,没落到书面上都不算数,朋友圈更是不能当“清白证明”。
总的来说,拿补偿就按规矩来;不想被约束就别签。
面试题:任务调度器
LeetCode 上这题大概是这样:
有一台单核 CPU,一次只能执行一个任务。 给你一堆任务,比如 ['A','A','A','B','B','C'],同一个字母就是同一种任务。CPU 执行完某种任务后,必须“冷却” n个时间单位,期间不能再执行同一种任务,但可以执行别的任务,或者空转(idle)。问:最少需要多少个时间单位,才能把所有任务干完?
比如:tasks = ["A","A","A","B","B","B"], n = 2一个最优安排是:A B idle A B idle A B,长度是 8。
最直接的想法:每次都挑目前剩下次数最多的任务来执行,这样热门任务尽量被“分散”开,中间塞别的任务。
一个常见写法是:
统计每种任务的出现次数; 用最大堆(优先队列)每次弹出“剩余次数最多”的几个任务; 一轮最多执行 n+1个不同任务,执行完这一轮,如果还有剩余次数,再塞回堆里;直到堆空为止,顺便数时间。
这个方案能过题,不过代码会偏长,还要维护堆、轮次啥的,思路上是没问题的:尽量把频率高的任务分散开,中间用其他任务或者 idle 填坑。
但这题有个更优雅的数学解,面试说出来比较加分。
关键观察: 真正决定排布长度的,是出现次数最多的那种任务。
设:
max_count= 某种任务出现的最大次数;max_kinds= 有多少种任务的次数都等于max_count。
举个例子:A 出现 3 次,B 出现 3 次,C 出现 1 次:
max_count = 3max_kinds = 2(A 和 B)
想象一下,把所有“最频繁”的任务先排成几行,比如只看 A:
A _ _ A _ _ A
max_count = 3,那就有 max_count - 1 = 2 个“间隔”,每个间隔长度是 n+1:
前面的 max_count - 1行,每行长度至少是n+1(“任务 + n 个冷却格”)。最后一行只放那些“出现次数最多的任务”,不需要后面的冷却了。
如果有好几种任务都同频,比如 A、B 都是 3 次,你可以这么想:
A _ _ A _ _ A
B _ _ B _ _ B
最后一列会堆在一起,所以总格子数公式就出来了:
理论上最少需要:(max_count - 1) * (n + 1) + max_kinds
但这只是“按最难任务计算出来的框架长度”。如果你的任务特别多,把所有任务都塞进去后,总任务数本身可能比这个框架更长,那答案就应该是任务总数。
所以最终答案是:
max( len(tasks), (max_count - 1) * (n + 1) + max_kinds )
这行式子非常经典,基本就是这题的核心。
按上面思路,Python 写出来就很短了,用 collections.Counter 就行:
from collections import Counter
from typing import List
classSolution:
defleastInterval(self, tasks: List[str], n: int) -> int:
# 统计每种任务的出现次数
counter = Counter(tasks)
# 出现的最大次数
max_count = max(counter.values())
# 有多少种任务的次数都等于最大次数
max_kinds = sum(1for c in counter.values() if c == max_count)
# 公式:(max_count - 1) * (n + 1) + max_kinds
frame_len = (max_count - 1) * (n + 1) + max_kinds
# 结果是 “任务总数” 和 “框架长度” 之间取最大
return max(len(tasks), frame_len)
简单分析一下复杂度:
统计次数 O(m),m是任务种类数(最多 26 个字母,可以当常数);整体时间复杂度就是 O(len(tasks)),空间复杂度也差不多。
在实际业务里,很多排班、限流、冷却时间的问题,脑子里都可以往这个模型上靠一靠:找出最“频繁”的那拨东西,然后想怎么把它们拆开放在一个时间轴/队列里,中间用别的任务填空,这种“按最坏瓶颈倒推公式”的方式,在调度、缓存、数据库这些场景也挺常用的。
-END-
我为大家打造了一份RPA教程,完全免费:songshuhezi.com/rpa.html
虎哥作为一名老码农,整理了全网最全《python高级架构师资料合集》,总量高达650GB