研发7年,目前年包80左右。是外企继续苟着还是回老家国企?
刚看到个贴子,一个34岁的研发哥们儿,年包80万,在外企干了7年,现在纠结要不要回老家国企,税前7k的技术岗,正式劳动合同但没编制。他说想躺平,又舍不得工资。
我觉得这事吧,关键是“你想要什么生活”。外企的钱多,但节奏快、压力大,尤其35岁以后,动不动裁员真心焦虑;国企虽稳,但小城市7k工资,躺是能躺,可生活质量也确实打折。
网友里有人劝他“人到中年就该求稳”,也有人说“再卷几年攒钱”。我倒觉得,别被“苟”或“躺”这两个词带节奏。人不是机器,哪种状态更让你安心、能活得自洽,那就选那个。
说到底,工作是谋生的,不是谋命的。钱够用、心不慌,比挣得多但整天焦虑更值。【备注:文末可领最新资料】
算法题:情侣牵手
昨天晚上十一点多,我在公司楼下吃完关东煮,还在想那道“情侣牵手”题,脑子里就一个画面:一排沙发,座位两两一组,情侣编号是(0,1)、(2,3)、(4,5)…反正偶数跟它下一个就是一对。现在人已经随便坐了,目标是用最少的交换把每组沙发坐成一对。交换的规则也很随意——任意两个人对调位置都行,但我们肯定不想乱换,对吧。
思路就一个“就地撮合”
怎么省事?我每次只管一张沙发的左座(下标 i,i 从 0 开始每次加 2)。左座的人 a 已经坐好了,那他/她的对象应该是 a^1(位运算小技巧:偶数的对象是它+1,奇数的对象是它-1,统一写成 a ^ 1)。如果右座刚好就是对象,好,啥也不干。不是对象?那就把真正的对象从它现在坐的那个位置“换”到右座来。一次交换就成一对,计数+1,然后继续下一张沙发。这个贪心很自然,因为每一步都把一对锁死,不会影响之前的对,也不给之后添乱。
实现细节有个小点:为了 O(1) 找到“对象现在在哪”,我们维护一个 pos[],记录“人 -> 当前位置”。每次交换之后记得更新这两个被交换的人的位置,否则下一步就迷路了。
代码
import java.util.*;
publicclassCouplesHoldingHands{
publicintminSwapsCouples(int[] row){
int n = row.length;
int[] pos = newint[n];
for (int i = 0; i < n; i++) pos[row[i]] = i;
int swaps = 0;
for (int i = 0; i < n; i += 2) {
int a = row[i];
int b = a ^ 1; // a 的对象
if (row[i + 1] == b) continue; // 已经牵上手了
// 把对象 b 换到 i+1 来
int j = pos[b]; // b 当前坐标
swap(row, i + 1, j);
// 交换后更新两人的位置:原右座的人、以及 b
pos[row[j]] = j;
pos[b] = i + 1;
swaps++;
}
return swaps;
}
privatevoidswap(int[] row, int i, int j){
int tmp = row[i];
row[i] = row[j];
row[j] = tmp;
}
// 简单测一下
publicstaticvoidmain(String[] args){
CouplesHoldingHands s = new CouplesHoldingHands();
System.out.println(s.minSwapsCouples(newint[]{0,2,1,3})); // 1
System.out.println(s.minSwapsCouples(newint[]{3,2,0,1})); // 0
System.out.println(s.minSwapsCouples(newint[]{5,4,2,6,3,1,0,7})); // 2
}
}
为啥对?
直觉版证明:每次操作把第 i、i+1 这一对座位“定型”。如果右座不是对象,我们用“一次交换”把对象换过来,这一步一定是必要的(否则这一对永远不可能配对)。而且我们没动到之前已经配对好的座位,也不会让后面的配对更难,因为被换走的人被丢回了它对象所在的那一张沙发的某个位置,后面还会轮到那张沙发时处理。总体时间 O(n),空间 O(n),下班回家路上都能手撕。
小结
这题关键就两件事:用 a^1 快速找对象、用 pos[] 秒定位并及时更新。别想太多全局最优啊图论啊,贪心在这儿就够硬。哦对了,我刚打字时差点把异或写成加一减一,别学我粗心…我去给猫加点饭,先这样。
-END-
我为大家打造了一份RPA教程,完全免费:songshuhezi.com/rpa.html