程序员老鬼

外企8000工资,干8000的活,国企5000工资,踏实工作不犯错就可以了,私企3000工资,你要知足懂感恩

刚看到个贴子,说外企8000工资干8000的活,国企5000工资只要稳稳不犯错,私企3000工资还得天天被教育要感恩。作为程序员看这事,我觉得核心就是性价比。

Image

网友们的评论不少,有人羡慕外企的清晰边界,有人觉得国企最稳当,也有人吐槽私企PUA最恶心。我认同一点:不管哪种公司,都是在算账,都是在权衡价值。你能创造多少价值,决定你值不值得那份薪水。

程序员干活就像写代码,需求定了,写多少逻辑就该拿多少报酬。如果写了8000行代码只拿3000块,还被老板要求“要懂感恩”,这逻辑就是死循环了 但国企那种“少错就是功劳”的环境,久了也容易让人技术停滞。

所以我的看法是:选公司就像选技术栈,不能只看眼前舒服与否,还要看未来有没有成长空间。工资多少是一回事,能不能让你升级打怪更重要。【备注:文末可领最新资料】

算法题:石子游戏

昨天晚上十一点多,在公司楼下抽烟,我跟我们组那个小李,拿着几颗小石子在地上排成一列…啊对,像题目里那种 piles[ ],两个人从两端拿,分数是石子数,谁多谁赢。小李说“哥,这玩意到底咋做”,我困得眼睛打架,但脑子还在线:这个…怎么说呢…就是博弈+区间动态规划,别被名字吓到。

你们知道吧,俩人都很聪明,都想拿到最大。每次只能拿最左或最右。重点不在“我现在拿多少”,而在“我拿完以后把对手逼到一个更差的区间”。所以我们别直接记“总分”,而是记“相对领先分”。听着绕,其实不难:定义 f(l,r) 是“在区间 [l,r] 先手能比后手多拿的最大差值”。这样就能把对手的选择揉进去,省心。

就是转移: 先手要么拿左边 piles[l],那对手在 [l+1,r] 里先手了,所以我最终差值 = piles[l] - f(l+1,r)。 要么拿右边 piles[r],差值 = piles[r] - f(l,r-1)。 我肯定挑更大的那个,f(l,r)=max(…,…)。边界是 l==r 时 f(l,l)=piles[l]。最后看 f(0,n-1)>0 就是我赢。等等我接个电话……好了继续说。这个写成自底向上的 DP,避免递归栈,顺便提前把长度为1、2…的区间刷一遍。

对了插一句,LeetCode 上那道经典“石子游戏(877)”如果保证堆数是偶数、石子总和固定,其实先手一定赢,直接 return true 就完事儿。可面试官一般会让你把 DP 也写出来,别偷懒哈。

publicclassStoneGame{
// 返回先手是否能赢
publicbooleanstoneGame(int[] piles){
int n = piles.length;
int[][] dp = newint[n][n]; // dp[l][r] = 先手相对后手的最大领先分

// 区间长度为1的底
for (int i = 0; i < n; i++) dp[i][i] = piles[i];

// 按区间长度从小到大填
for (int len = 2; len <= n; len++) {
for (int l = 0; l + len - 1 < n; l++) {
int r = l + len - 1;
int takeLeft  = piles[l] - dp[l + 1][r];
int takeRight = piles[r] - dp[l][r - 1];
                dp[l][r] = Math.max(takeLeft, takeRight);
            }
        }
return dp[0][n - 1] > 0;
    }

// 如果题目就是“877石子游戏”,先手必胜:开启这行走捷径
publicbooleanstoneGame877(int[] piles){ 
returntrue; 
    }
}

空间还能省:只跟“上一行/上一列”有关,用一维滚动也行,只是下标顺序要小心,别反了。还有啊,面试时别上来就背诵“区间 DP”,先随手画个 3~4 堆的例子,嘴巴把 f(l,r) 的意义说清楚,气势就赢一半。行了我去泡面了…噢对,记得把 l、r 的边界判定写对,别像小李那样数组越界把我吓一跳。

-END-

我为大家打造了一份RPA教程,完全免费:songshuhezi.com/rpa.html

最后给大家分享一份不错的副业资料,点击下方公众号,回复关键字: 副业 领取,也可以链接我领取,微信:hls404