特斯拉工作6年被裁,看看总共拿到多少赔偿
这哪是被裁,像是领了个“离职大礼包”。
特斯拉干了6年,被裁之后一算账,光补偿就挺吓人。工龄按6年算,再加上额外3个月,差不多拿了9个月工资,三十多万先到账。年假也没糊弄,法定的、公司多给的,折成钱又是几万。
更夸张的是股票。因为裁员触发加速归属,本来可能还得等的RSU,直接折现拿到手,又是一大笔。再加上之前产线关键期留下来干活,公司还补了两个月工资,当作留任奖励。
工资、社保、公积金也给到5月底,连找工作的辅导服务都安排了。
最后一合计,六十多万。
打工人看完真有点沉默。平时说大厂裁员吓人,但这个赔法,至少台面上是做足了。很多公司别说N+3了,能把N给利索都算烧高香。
特斯拉这波,裁得狠不狠另说,钱是真没少给。
车不是一站一站开的,人数也不是一段一段硬算的。
这题卡人的地方不在“拼车”,而在你有没有把上下车看成两次人数变化。有人从 from 上车,人数增加;到 to 下车,人数减少。中间每个站点到底坐了多少人,扫一遍就知道。
我一般看到这种数据:
trips = [[2,1,5],[3,3,7]]
capacity = 4
第一眼不会去模拟每个乘客,也不会建什么车厢对象。那都是给自己找事。
真正有用的信息只有两条:
1 号点 +2
5 号点 -2
3 号点 +3
7 号点 -3
扫到 3 号点的时候,车上人数变成 5,容量只有 4,直接炸。
这种题用差分数组很顺手。站点如果题目限制在 1000 以内,就别排序了,数组扫过去,干净。
classSolution{
publicbooleancarPooling(int[][] trips, int capacity){
int[] seatChange = newint[1001];
for (int[] trip : trips) {
int people = trip[0];
int getOn = trip[1];
int getOff = trip[2];
seatChange[getOn] += people;
seatChange[getOff] -= people;
}
int inCar = 0;
for (int stop = 0; stop < seatChange.length; stop++) {
inCar += seatChange[stop];
if (inCar > capacity) {
returnfalse;
}
}
returntrue;
}
}
这里有个细节别写错:getOff 这个点是下车点,不算还坐在车上。
比如一个人从 1 到 5,意思是在 5 号点已经下车了,所以:
seatChange[1] += people;
seatChange[5] -= people;
不是在 5 + 1 的地方减。
这类题最怕写成两层循环:
for 每个行程
for 每个站点
加人数
数据小的时候能过,数据一大就很难看。更重要的是,这个写法把问题想重了。车上人数不是每段重新算,而是沿着站点不断累加变化。
如果站点范围题目没给得很小,那我会换成 TreeMap,只记录发生变化的位置,再按站点顺序扫:
import java.util.Map;
import java.util.TreeMap;
classSolution{
publicbooleancarPooling(int[][] trips, int capacity){
TreeMap<Integer, Integer> changes = new TreeMap<>();
for (int[] trip : trips) {
changes.merge(trip[1], trip[0], Integer::sum);
changes.merge(trip[2], -trip[0], Integer::sum);
}
int current = 0;
for (Map.Entry<Integer, Integer> entry : changes.entrySet()) {
current += entry.getValue();
if (current > capacity) {
returnfalse;
}
}
returntrue;
}
}
数组版适合站点范围小,TreeMap 版适合站点范围大。思路一样,都是把“某段路有多少人”转换成“某个点人数发生了什么变化”。
这题只要差分这个口子打开,就没什么复杂的了。上车加,下车减,从左往右扫,超过容量就返回 false。不超过,就说明这辆车扛得住。