某大厂员工:领导让他报裁员名单,结果这哥们竟然把自己写上去,拿着20多万的赔偿,去付买房的首付!
刚看到个贴子,说某大厂员工被领导问要裁员名单,结果这哥们直接把自己写进去,拿了二十多万赔偿当房子的首付,网友都说他是“职场清醒人”。
这哥们其实是算清楚了——与其在里面耗着,不如趁政策好拿一笔离场费,起码把钱落袋为安。
说到底,职场从来不是养生地,是讲“性价比”的地方,别人留你,是因为你有价值;你愿不愿意留下,也得看这份工作值不值。
不过话说回来,能把自己写进裁员名单的人,说白了是心里有底的:要么攒了钱,要么方向明确,要么真的不怕重来。
普通打工人可能没这魄力,但这个选择思路值得学——别把自己绑在岗位上,机会来时,果断也能是实力。【备注:文末可领最新资料】
面试题:换座位
你可以脑补这么个场景:一排同学按顺序坐着,座位号从 1 开始往后排。现在老师突然说:“大家两两换个位置哈,1 和 2 换,3 和 4 换,以此类推。如果人是奇数,最后那位不用动。”
抽象成算法就是: 给你一个数组,数组下标 0 开始,对应座位 1。让你把相邻的两个元素成对互换,像这样:
原来:[1, 2, 3, 4] → 换完:[2, 1, 4, 3] 原来:[1, 2, 3, 4, 5] → 换完:[2, 1, 4, 3, 5]
就这么回事,很生活化的一个小题。
思路一:最顺手的写法(原地两两交换)
这个题啊,别想复杂了。你就顺着数组往后走,每次跨两个位置,手里拿着一对同学,给他们互换一下:
i 从 0 开始 每次处理 seats[i] 和 seats[i+1] 然后 i += 2 往后跳 注意循环条件用 i + 1 < n,避免越界(奇数个人最后一个就不会被处理,自然就没换座)
用 Java 写一下,大概是这个样子:
publicclassSwapSeats{
// 核心方法:两两换座位
publicstaticvoidswapSeats(int[] seats){
// 边界情况,0 个或 1 个同学,不用换
if (seats == null || seats.length <= 1) {
return;
}
// i 每次加 2,成对处理
for (int i = 0; i + 1 < seats.length; i += 2) {
int tmp = seats[i];
seats[i] = seats[i + 1];
seats[i + 1] = tmp;
}
}
// 简单测一下
publicstaticvoidmain(String[] args){
int[] seats1 = {1, 2, 3, 4};
swapSeats(seats1);
// 预期:2 1 4 3
printArray(seats1);
int[] seats2 = {1, 2, 3, 4, 5};
swapSeats(seats2);
// 预期:2 1 4 3 5
printArray(seats2);
}
privatestaticvoidprintArray(int[] arr){
StringBuilder sb = new StringBuilder();
for (int x : arr) {
sb.append(x).append(" ");
}
System.out.println(sb.toString().trim());
}
}
这版的几个点你心里要有数:
时间复杂度:只走一遍数组,O(n) 空间复杂度:只用一个临时变量,O(1) 奇数长度自动兼容,因为 for 条件是 i + 1 < seats.length,最后一个没人和他配对就不处理了
思路二:不想改原数组怎么办?
有时候面试官嘴一抖,说“不要修改原数组,返回一个新数组”。那也简单,我们就新建一个 same size 的数组,照样两两互换,不过换完写到新数组里:
publicstaticint[] swapSeatsNew(int[] seats) {
if (seats == null || seats.length <= 1) {
return seats;
}
int n = seats.length;
int[] ans = newint[n];
int i = 0;
// 先成对处理
for (; i + 1 < n; i += 2) {
ans[i] = seats[i + 1]; // 当前位置变成后面的同学
ans[i + 1] = seats[i]; // 后面的位置变成前面的同学
}
// 如果是奇数个,最后一个原样拷过去
if (i < n) {
ans[i] = seats[i];
}
return ans;
}
这个写法本质上一样,只是空间复杂度从 O(1) 变成了 O(n),换来的是不动原始数据,在一些“数据只读”的场景会用得上。
顺便聊聊常见坑
这个题看着简单,写快了还是容易翻车,几个小坑提一下:
下标从 0 还是 1? 题目说“座位号从 1 开始”,但数组下标是 0 开始的,不要在 for 里面写成
for (int i = 1; i + 1 <= n; i += 2)这种直接照题意搬过来的写法,很容易搞混。循环结束条件写错 正确是
i + 1 < n,如果你写成i < n或i <= n - 1,再粗心一点忘了 i 每次加 2,就会在奇数长度时越界。忘记处理空数组、长度为 1 的数组 面试官有时候就爱给你整一个这种输入,看你是不是一上来就对数组 length 做个 quick check。
整个“换座位”这道题,其实就是“相邻元素两两交换”的经典模型:
想要最省空间:就地交换,用一个 tmp 变量就行 想保护原数据:新建数组,把换完的结果塞进去 奇数长度:最后一个自然不动,不需要写额外逻辑专门标记它“不能换”
搞清楚这几个点,再碰到类似“相邻成对操作”的题,比如成对翻转链表节点、成对处理数组里的元素,其实套路都差不多,只是数据结构从数组换成了链表,或者换个语境而已。
-END-
我为大家打造了一份RPA教程,完全免费:songshuhezi.com/rpa.html