无语,公司直接集体降薪,同事18K变10K。。
最近看到一个帖子,说某小公司直接集体降薪,工资一万以上的统统砍成10K。有个同事原本拿18K的,一夜之间就缩水成10K,干的活一点没少,甚至更多。
讲真,看完第一反应不是愤怒,而是“这老板也太聪明了”,用“降薪”这招,成功绕过了裁员赔偿的成本,还能逼人主动辞职,真是省钱省到骨头里了 。
有时候你不得不承认,这年头连裁员都开始讲性价比了。以前还能混个N+1,现在呢?没有N,没有1,就一个“请你自觉滚蛋”的潜台词,还得你笑着走人。
你说可笑不可笑?
也别问什么对策了,现在这行情,很多人已经不是在找工作,而是在找“活口”——能活着就不错了,别指望什么公平和情绪价值了。
有工资就偷着乐吧,不降就是福。至于加薪?醒醒,那是梦里的事。
面试题:最长重复子串
你有没有遇到过这种需求:找一个字符串里出现次数最多、且重复的最长子串?比如 "banana",你可能第一反应是 "ana",确实,恭喜你中了这道经典的面试算法题:最长重复子串。
这题其实挺有意思的,乍一看像是个字符串暴力枚举的问题,但真要动手你就会发现——不简单。
我第一次做这题的时候,脑子里立刻蹦出的是“枚举所有子串然后查有几个重复的”,然后就写了个双层循环的暴力解法,跑起来... 只能说能跑个 "abababababab" 已经很感人了 😅。
先简单说下题意: 给定一个字符串 s,找出其中出现不止一次的最长子串。如果有多个,随便返回一个。
来看一下暴力思路的代码:
deflongestDupSubstring(s: str) -> str:
n = len(s)
res = ""
for i in range(n):
for j in range(i+1, n):
sub = s[i:j]
if sub in s[j:] and len(sub) > len(res):
res = sub
return res
说实话,这代码放简历里都觉得害臊,时间复杂度 O(n^3) 起步,不管面试官给你笑不笑,反正这代码绝对先把服务器CPU烧笑了 🔥。
那正解该怎么写?很多文章会甩个“后缀数组+LCP”的方案,但对于日常开发或者普通面试来说,有点重量级了,而且实现起来不那么友好。
所以我更喜欢讲一个稍微容易实现点的做法:二分+哈希(Rabin-Karp)。其实也不轻松,但在理解上好很多。
思路大致是:
二分最长重复子串的长度; 对于每个长度,滑动窗口跑哈希值,看有没有重复的。
来看关键代码部分👇:
deflongestDupSubstring(S: str) -> str:
import random
mod = 2**63 - 1
base = random.randint(26, 100)
n = len(S)
defcheck(L):
h = 0
for i in range(L):
h = (h * base + ord(S[i])) % mod
seen = {h}
power = pow(base, L, mod)
for i in range(1, n - L + 1):
h = (h * base - ord(S[i - 1]) * power + ord(S[i + L - 1])) % mod
if h in seen:
return i
seen.add(h)
return-1
left, right = 1, n
start = -1
while left < right:
mid = (left + right) // 2
idx = check(mid)
if idx != -1:
left = mid + 1
start = idx
else:
right = mid
return S[start: start + left - 1] if start != -1else""
这个做法的精髓就在于把“有没有长度为k的重复子串”这个问题变成了一个判定问题,然后二分来找最大可能长度。这种套路在字符串类题目里很常见,比如“最长回文”、“最长相等子串”等。
当然,这种写法也是要踩坑的。比如哈希碰撞的问题,你看我上面用了 random.randint 来变换基数,其实就是在降低碰撞概率(面试时可以直接写死个大质数基数比如 31 或者 101)。
而且 2^63 - 1 是个经典的大质数,很多语言默认的long整数溢出都比较友好(Python 是无限精度,但别的语言要注意)。
这题我印象最深的一次是跟我们架构组一哥讨论优化方法时,他看了下代码,沉默两秒,然后跟我说:“你这个,跟暴力其实只差个哈希表了。”——确实,说得不冤 😂。不过也从那次学到了“不是所有二分都能救命”的道理。
如果你非要性能极致,那就得用后缀数组+LCP配合来搞,O(n log n)级别的效率,但代价就是代码量和心智负担陡增。反正,非ACM场景里能用二分哈希解决已经够用了。
最后再提一句,这题如果你换个问法,比如找“所有重复子串出现次数大于K次中最长的”那种,就没这么容易了。得改进哈希结构或者换后缀树啥的,直接上“开卷”阶段了 。
最后,我为大家打造了一份deepseek的入门到精通教程,完全免费:https://www.songshuhezi.com/deepseek
也可以看我写的这篇文章《DeepSeek满血复活,直接起飞!》来进行本地搭建。
对编程、职场感兴趣的同学,大家可以联系我微信:golang404,拉你进入“程序员交流群”。
虎哥作为一名老码农,整理了全网最全《python高级架构师资料合集》。