除了少数核心人员,其余年龄超过35岁的人全部被裁员了。。
昨天晚上加班回来,脑子还有点懵,就刷到一个帖子,说有家公司裁员特别狠,除了少数核心人员,35岁以上的几乎全都被干掉了🤯。今天面试正好碰到一个38岁的老哥,他就是那波被裁的。我一问细节,他苦笑,说他们业务线直接按年龄来“优化”,技术能力反倒没人关心。
说实话,这事儿在程序员圈子里不算稀罕。尤其做研发的,项目迭代快,公司觉得年轻人便宜、加班耐操,就直接用“年龄阈值”来清场,压根不去看你是不是系统架构救火王,或者线上事故的终结者。很多老同事,KPI、Bug率都漂亮,但架不住一轮“35+裁员政策”🥲。
我自己想了想,这种环境下,如果你还在一条业务线上死磕,不去拓宽技术面或转型,那真有可能哪天HR一句话就让你关IDE了。所以啊,平时除了写代码,也得多考虑下自己的技术可迁移性,不然,真到被“优化”那天,连个缓冲都没有。【备注:文末可领最新资料】
算法题:环形数组是否存在循环
小李在群里说:哥们儿,那个…环形数组啥的,有没有循环?我一愣,哦对对对,就是 LeetCode 那题,脑子一热就跟他说了这么一大段——你们也听听,别介意我说话断断续续的哈。
嗯…题意就是一个整数数组,每个元素 nums[i] 表示往前走(正)或往回走(负)多少步,数组首尾是连着的,像绕圈跑。问存不存在长度≥2的循环,而且方向得一致,不能一会儿正、一会儿负。这个限制很阴险,面试官就爱拿它卡人。
我当时在台阶上数步子…就是那个怎么说呢,快慢指针那套:从每个还没被判过死刑的位置起步,一个指针一步一步走,另一个两步两步蹦。只要两人同向并且都能继续,就跑;要是方向变了或者只剩自己绕回自己(长度1的圈),那这个起点就没戏。判完没戏的点,顺手做个“标记清除”,下次就别重新跑一遍了,省事儿。
下一个位置要用模运算,越界就折返: ((i + nums[i]) % n + n) % n,别被负数绕晕。方向一旦定了,就必须一致: (nums[next] > 0) == dir。单元素自环直接否: next == i这就是长度1,淘汰。跑崩的那条链路,用一条“回填”把沿途都标记掉,后面起点跳过,时间就 O(n) 了。
(别吐槽变量名,我人已经困糊了…不过能跑的)
publicclassCircularArrayLoop{
publicbooleancircularArrayLoop(int[] nums){
int n = nums.length;
for (int i = 0; i < n; i++) {
if (nums[i] == 0) continue; // 被标记过,跳
boolean dir = nums[i] > 0;
int slow = i, fast = i;
while (true) {
slow = next(nums, slow, dir);
if (slow == -1) break;
fast = next(nums, fast, dir);
if (fast == -1) break;
fast = next(nums, fast, dir);
if (fast == -1) break;
if (slow == fast) returntrue; // 撞上了就是圈(长度>=2已在next里保证)
}
// 无环,清理这条链路,避免重复遍历
int idx = i;
while (true) {
int nextIdx = next(nums, idx, nums[idx] > 0);
if (nextIdx == -1) { nums[idx] = 0; break; }
nums[idx] = 0;
idx = nextIdx;
}
}
returnfalse;
}
privateintnext(int[] nums, int i, boolean dir){
int n = nums.length;
// 方向不一致,堵死
if ((nums[i] > 0) != dir) return -1;
int j = ((i + nums[i]) % n + n) % n; // 安全取模
// 单点自环不要
if (j == i) return -1;
// 方向一致才有效
if ((nums[j] > 0) != dir) return -1;
return j;
}
// 随手来个小测试
publicstaticvoidmain(String[] args){
CircularArrayLoop c = new CircularArrayLoop();
System.out.println(c.circularArrayLoop(newint[]{2,-1,1,2,2})); // true
System.out.println(c.circularArrayLoop(newint[]{-1,2})); // false
System.out.println(c.circularArrayLoop(newint[]{-2,1,-1,-2,-2})); // false
}
}
我跟小李说,别怕,时间 O(n):每个位置最多被“清零”一次;空间 O(1):就地标记,不开额外哈希。快慢指针能撞上就说明存在一个同向的环,而且我们把长度1的坑提前掐掉了…呃对,剩下的就是实现别写崩。
哎,群里有人问“为啥我总是超时?”——多半是忘记清零回收,或者起点每次都全数组瞎跑。还有负数取模那个,(a % n + n) % n 这种写法记一下,别问我为啥记得这么牢,昨儿踩了俩小时…
-END-
我为大家打造了一份RPA教程,完全免费:songshuhezi.com/rpa.html