程序员老鬼

外包年薪55万,正编年薪28万如何选?目前我是在一家顶级外企的外包岗位做资深研发公司也舍得给钱,年薪55要,目前已经在公司呆了两年了。

刚看到个贴子,说楼主在顶级外企做外包资深研发,年薪55万,干了两年。年末拿到某大厂正编 offer,年薪只有28万,就开始纠结该怎么选。

Image

我觉得这事关键看你当下的主线任务。要是有房贷、有家庭压力,就别假装自己不缺钱,高薪外包先干着,同时逼自己补技术、拓人脉,给下一跳铺路。要是你还年轻、负担不重,更看重平台和长期发展,那28万的正编也不算亏,起码晋升通道、项目资源、内部流动机会都在那儿。

不过话说回来,没有哪条路一定更高级,只有适不适合现在的你。算清钱,想明白三五年后的自己,再做选择。

面试题:到达终点

昨晚十一点多吧,我在公司楼下抽烟,群里小李突然问我一句:东哥,“到达终点”这题到底咋写才像人写的……我当时脑子还在想线上那堆告警,结果一看题,哦,就是那个经典的数组跳格子,你站在下标0,每个位置给你个最大能跳的步数,问你能不能跳到最后一个位置。

这题你要是按“我每一步都试一下”那种写法,别说面试了,线上都扛不住,分分钟指数级爆炸。其实它的本质吧,怎么说呢…就跟你带团队排期一样:你不需要把每个任务怎么做都推演完,你只要知道“我目前最远能覆盖到哪”。覆盖到最后一天,项目就能交付;覆盖不到,就凉。

所以思路特别像架构里的“可达性边界”,我用一个变量 farthest 表示:从起点出发,走到当前下标 i 之前,我能到的最远位置。然后你遍历数组:

  • 如果你发现 i 已经大于 farthest 了,那你连这个点都到不了,还谈啥终点,直接 false。
  • 否则你就更新 farthest = max(farthest, i + nums[i])
  • 一旦 farthest >= n-1,就可以提前收工了(像那种监控一旦命中阈值就直接报警,不用等全量日志跑完)

我当时跟小李说:这题写出来得像平时写服务兜底一样,别搞花活,关键是“边界”和“提前返回”。

Java 我一般就这么写,干净利落,线上同样好读:

publicclassReachEnd{

// nums[i] 表示从位置 i 最多能跳 nums[i] 步,问能否到达最后一个下标
publicstaticbooleancanReachEnd(int[] nums){
if (nums == null || nums.length == 0) returnfalse;
int farthest = 0;
int last = nums.length - 1;

for (int i = 0; i < nums.length; i++) {
// 走不到当前位置,后面更不可能
if (i > farthest) returnfalse;

            farthest = Math.max(farthest, i + nums[i]);

// 提前结束:已经覆盖到终点了
if (farthest >= last) returntrue;
        }
returntrue; // 能遍历完,说明每一步都可达
    }

// 随手写个 main 自测一下,别笑,我线上也常这么先跑一把
publicstaticvoidmain(String[] args){
        System.out.println(canReachEnd(newint[]{2, 3, 1, 1, 4})); // true
        System.out.println(canReachEnd(newint[]{3, 2, 1, 0, 4})); // false
        System.out.println(canReachEnd(newint[]{0}));             // true(已经在终点)
        System.out.println(canReachEnd(newint[]{1, 0, 0}));       // false
        System.out.println(canReachEnd(newint[]{2, 0, 0}));       // true
    }
}

这里面有个小坑,很多人会纠结“最后 return true 还是 false”。其实你按上面的逻辑,能跑完整个 for,说明每个 i 都没超过 farthest,也就是一路都能到,那最终肯定能到最后(或者中途早就提前 return true 了)。当然你也可以更保守点,把最后那行改成 return farthest >= last;,都行,我就是懒…啊不是,减少脑补空间。

再说个特别像事故排查的点:为什么贪心对?因为你每次更新的不是“我从这一步怎么跳”,而是“我能覆盖到的最远边界”。边界越大越好,后续选择只会更多不会更少。你把它当成一个单调不减的“可用资源池”就很顺,跟线程池扩容、限流窗口那套味道很像:关注能力上限,而不是每个请求的细节路径。

小李当时又问:那如果数组里全是0咋办。我说那就看你站在哪啊,你站在0并且长度是1,你已经到终点了,别自己吓自己;但长度大于1还遇到0,就看你之前的 farthest 能不能跨过去,跨不过去就是断点,跟链路里某个服务超时一样,后面全是“看起来还行”,其实都到不了。

行了我先不说了,刚刚又弹了个消息说 CI 又挂了,我得去看看到底是谁把单测给注释了…哎这种事天天有,烦。

-END-