某大厂员工吐槽:月薪2万多,每天工作11个小时,公司反而舍不得裁了我,身边有同事被裁都拿了N+1,羡慕
刚看到个贴子,说某大厂程序员月薪2万多,每天干11个小时,公司舍不得裁他,他反而羡慕同事被裁还能拿N+1。
我觉得这事吧,挺典型的程序员困境:钱不少,但时间全搭进去了。网友里有人说“起码你还稳定”,也有人说“N+1才是最大的年终奖”。从程序员角度看,这就是性价比问题——公司算你产出稳定,所以宁可压榨也不放人;你算自己的时间成本,发现其实比裁员补偿还不划算。
换个角度想,N+1是一锤子买卖,之后得重新找工作,风险挺大;而稳定岗位虽然累,但能持续带来现金流。说到底,裁员赔偿是一次性的,长工时却是常态。
是要短期补偿,还是要长期收入。无论哪种选择,能撑下去的才是真正的赢家。【备注:文末可领最新资料】
算法题:索引处的解码字符串
昨晚十一点多我在公司楼下吹风,手机电量剩个3%,小李发来一道题,说他面试又被问到了“索引处的解码字符串”。我一边找共享单车一边给他念叨:这个题别真的去“解码”,会爆内存的,对吧。核心是模拟长度,不生成结果。
给你一个由字母和数字组成的字符串S,数字d表示把当前已构建的字符串整体重复d次。比如“ab2c3”解码后是“ababcababcababc”。现在给个索引K(从1开始),问解码后第K个字符是谁。难点是解码后可能超大,直接展开必死。
就是那个……先正向扫一遍S,只管“长度”size。遇到字母size+1;遇到数字x,size*=x。你别慌,size可能很大,用long就行。接着反向再扫一遍,把K“投影”回去:因为末尾那一段其实是把之前的整体重复出来的,所以K对size/x取模就能折返到原来的那一份里。特殊点是当K%size==0时,说明落在边界,就当成size来处理。反向走到某个字母时,只要K==size或者K==0,就找到了答案。
两个坑别踩:第一,K是1-based;第二,long别溢出但也别用BigInteger,没必要。还有,当反向遇到数字时,把size/=数字;遇到字母时,把size--,同时判断K是不是刚好落在这个字母上。这样一路折返,复杂度就是O(n),空间O(1),手心不出汗。
S="leet2code3",粗算长度:先长到“leet”是4,遇2变8,再加“code”到12,遇3变36。假如K=10,反向折返:末尾3把36折回到12,K=10%12=10;“e”检查不命中,size--变11;再遇“d”…一路下去最后会落到某个字母上(别担心,代码会干净地算出来)。
publicclassSolution{
public String decodeAtIndex(String S, int K){
long size = 0;
for (char c : S.toCharArray()) {
if (Character.isDigit(c)) {
size *= (c - '0');
} else {
size++;
}
}
long k = K; // 用long避免越界
for (int i = S.length() - 1; i >= 0; i--) {
char c = S.charAt(i);
if (Character.isDigit(c)) {
long d = c - '0';
size /= d;
k = k % size == 0 ? size : k % size;
} else {
if (k == size || k == 0) {
return String.valueOf(c);
}
size--; // 折返继续
}
}
return""; // 理论到不了这里
}
}
你看啊,在正向阶段我们只放大“总长”,反向阶段每遇到数字,其实就是把“重复d次”的带子倒回到单次长度;每遇到字母就把当前最后一个字符弹走,同时看看K是否正好指向它。整个过程像在回放录屏,K不断“取模折返”,最终一定停在一个字母上。
-END-
我为大家打造了一份RPA教程,完全免费:songshuhezi.com/rpa.html