程序员老鬼

互联网公司舒适度排行榜

刚看到个贴子,说的是互联网公司舒适度排行榜。作为程序员我第一反应就是:舒适度这玩意儿,跟代码的可维护性差不多,只有长期用下来才知道坑不坑。

Image

网友们有人说看重氛围,有人说看重薪资,我觉得这都对,但程序员角度看,最重要的还是节奏和自由度。你让我一直 996,薪水再高身体也撑不住;但如果环境太佛系,业务没增长,最后公司倒闭,舒适感也没了。就像选技术栈,流行的不一定稳定,冷门的可能没人维护,怎么选都是 trade-off。

我比较认同一个观点:别迷信所谓“最舒适的公司”,舒适度本质上就是成本分配。公司给你多少自由和福利,背后都得靠业绩撑着。换句话说,能不能长久写出干净可扩展的代码,跟团队文化和业务周期挂钩,而不是排行榜上一两句话能说明的。【备注:文末可领最新资料】

算法题:重复字符串

昨天晚上十一点多,在公司楼下等外卖,我们组那个小李突然问我:“东哥,那个…重复字符串怎么判断来着?”我一边哈气一边想,哎这题别硬背板书,讲人话也能讲清。

给你一个字符串 s,问它能不能由某个更短的子串重复拼起来。比如 abab 可以(ab×2),aba 不行,aaaa 可以(a×4)。长度为 1 的肯定不行,对吧。

拼接法,像贴两层胶带

有个很好记的小技巧:把字符串自己“叠个倍”——ss = s + s。如果 s 真是重复出来的,那它会在 ss 的中间再次出现;反之只会出现在开头和正中那两次。于是跳过第 0 位去找,看能不能在 0..n-1 之间命中:

publicclassSolution{
publicbooleanrepeatedSubstringPattern(String s){
int n = s.length();
if (n <= 1) returnfalse;
// 从下标1开始找,若命中位置不是n,说明中间找到了自己
return (s + s).indexOf(s, 1) != n;
    }
}

这招代码短,好记,面试写出来也不丢分。复杂度通常是 O(n),因为 indexOf 内部用的就是高效搜索。

KMP,想要“证明级别”的稳

要是面试官继续追问“有无不用库函数的线性解”,就上 KMP 的前缀函数(也叫 lps)。直观点说,lps[i] 是 s[0..i] 的最长“前后缀”长度。最后一个值 lps[n-1] 记作 len,如果 len > 0 且 n % (n - len) == 0,那就说明整个串是由长度 n - len 的周期重复出来的。

publicclassSolutionKMP{
publicbooleanrepeatedSubstringPattern(String s){
int n = s.length();
if (n <= 1) returnfalse;
int[] lps = newint[n];
for (int i = 1, j = 0; i < n; i++) {
while (j > 0 && s.charAt(i) != s.charAt(j)) j = lps[j - 1];
if (s.charAt(i) == s.charAt(j)) j++;
            lps[i] = j;
        }
int len = lps[n - 1];
return len > 0 && n % (n - len) == 0;
    }
}

这段背下来没必要,理解“最长前后缀 = 周期的重叠”就够用了。

空串通常不在题目范围内;长度 1 返回 false;大小写、空格都算字符,别自作聪明改动数据。像 aaaaaa 这种全相同字符,两种方法都能稳过。拼接法空间是 O(n)(建了个 s+s),KMP 额外 O(n) 存 lps;时间两者都能做到 O(n)。

写业务代码、追求快准:拼接法一行收工。需要讲原理、对抗“你别用库函数”的场景:KMP 把“周期”给解释明白就行。面试嘛…会两招更安心。

-END-

我为大家打造了一份RPA教程,完全免费:songshuhezi.com/rpa.html

最后给大家分享一份不错的副业资料,点击下方公众号,回复关键字: 副业 领取,也可以链接我领取,微信:hls404