程序员老鬼

从总监降为普通员工,被一家公司挖过去,答应年薪给85万,结果签合同时才发现有部分股权激励!要2年后兑现。。

从总监变普通员工,这事搁谁身上不闹心?

我一个朋友,前两年在一家中型互联网公司做技术总监,带着一整个后端团队。结果去年被新来的VP架空,最后心灰意冷主动离职。

刚歇俩月,有家公司找他去做核心开发年薪85万,朋友一听,立马兴冲冲去面,流程走得飞快,人都还没怎么接触,offer就发来了。

Image

结果合同一翻“年薪85万,含25万股权激励,需连续在职满2年方可兑现。

作为一个干了十年的码农我只能说,HR嘴里的“年薪”,你不拿合同对照细节看清楚,那你拿到的可能只是一个“希望”。

所以兄弟们,offer再香,也要一行行抠合同内容,别被口头画的大饼喂饱了,最后只能啃自己压箱底的泡面。【备注:文末可领最新资料】

算法题:加油站

这题是典型的贪心+循环数组组合拳,说是“中等难度”,其实看你第一次怎么下手,如果一开始没绕明白那个“能不能绕一圈回到起点”,估计得绕好几圈才悟出来 😅

题目意思大致是:你在一个环形的加油站链里,每个站点可以加油一定量(gas[i]),但是从这个站点出发到下一个要消耗一定量(cost[i]),问你从哪个加油站开始能把这圈跑完?

我当时第一反应是:模拟呗,从每个站点试一遍,看能不能回来……结果跑个几百组测试数据直接超时,这也太蠢了。后来想起有个贪心套路,就顺着这思路理了理。

重点来了,Java代码先上:

publicintcanCompleteCircuit(int[] gas, int[] cost){
int total = 0;  // 总体油量盈余
int curr = 0;   // 当前段油量盈余
int start = 0;  // 起始加油站索引

for (int i = 0; i < gas.length; i++) {
int diff = gas[i] - cost[i];
        total += diff;
        curr += diff;
if (curr < 0) {
// 当前段挂了,从下一个站重新开始
            start = i + 1;
            curr = 0;
        }
    }
return total < 0 ? -1 : start;
}

这个解法精髓就在于那句:“如果你从站点a走到b中间挂了,那就没必要再从a和a到b中间的任何一个点再试了”,因为一开始就亏油,后面越跑越亏……

看懂这点就通了。

total是用来判断是否整个路有解;curr是当前连续跑的一段的油量差,只要它小于0,说明从当前start跑不下去了,就得换。

注意哦,这里不是DP,也不是图论,虽然看起来有点环形图的意思,其实用一个循环就能搞定,用不到邻接表什么的,别一上来就重拳出击。

顺便提一下,别被“环”这个词唬住了,在代码里其实就是用一个线性循环模拟一下,最后start点能跑完整个数组就行,根本不用真的绕一圈(什么mod操作都省了 ✌️)

还有一个点,别尝试搞什么剪枝或者优先队列优化,因为这题就一个遍历,时间复杂度是O(n),空间是O(1),已经最优了,再折腾只会多此一举。

贪心这东西,核心就是判断当前局部选择是否影响全局,而这题就刚好满足——只要总油够,能跑通的入口就一定存在,而且是唯一的,这结论要是没搞明白,你永远都写不出这份代码。

回头想想,其实这题就是在讲“亏本生意不能做”的哲理:一旦发现当前阶段净亏,那就赶紧止损换人(换起点),否则就一直亏到爆仓 

你们要是以后面试碰到这题,千万别头铁从第0个站开始模拟一圈,那是让面试官看你表演的,不是让你找工作用的 😂

当然啦,讲归讲,现实项目中也不太可能真用这题的算法,但这个思路训练思维还是蛮有用的,尤其是让你对“贪心”的应用有更具体的感知。你看,程序员不就天天在加油赶路么,只不过有时加的是代码,有时是咖啡 ☕️

最后问一句,你觉得这个题换成双向加油站还能解吗?🤔

最后,我为大家打造了一份deepseek的入门到精通教程,完全免费:https://www.songshuhezi.com/deepseek

也可以看我写的这篇文章《DeepSeek满血复活,直接起飞!》来进行本地搭建。

-END-

ok,今天先说到这,老规矩,给大家分享一份不错的副业资料,感兴趣的同学可以链接我,微信:hls404 找我领取。

以上,就是今天的分享了,看完文章记得右下角点赞,也欢迎在评论区写下你的留言。