程序员老鬼

这四个offer四选一,你们觉得选哪个比较好?

这哪是让网友帮忙选 offer,这像是在给打工人测血压。 一个是车厂,钱给得不低,听着还带点“我在造未来”的味儿,但大厂节奏懂的都懂,自动驾驶这几个字看着酷,真干起来可能就是天天跟问题死磕。 一个是上海中学,工资少一大截,但安家费摆在那,数学老师也稳。你要是想过正常人日子,这个真不是不能选。只是从程序员视角看,多少有点“从卷代码切到卷学生”。
DeepSeek那个就很猛了,钱高,年终也厚,还挂着推理增强,听起来就是现在最热的坑位。问题也简单,热的地方一定挤,挤的地方一定累。 宇树机器人也香,钱差不多,方向还硬,机器人这块确实有想象力。但感知算法这活儿吧,听着未来,干着可能全是脏数据和奇怪 bug。 让我选,想冲就 DeepSeek,想稳就上海中学,想赌硬科技就宇树。特斯拉嘛,适合真爱粉。 今日面 试 题 奖金发完,财务那边一核,总数不对。 不是少发,是发多了。 这种题我第一眼不会去想排序,排序一上来,员工左右关系基本就被你自己拆没了。 题目大概是这样:一排员工,每个人有一个绩效分。每个人至少拿 1 份奖金。如果某个员工绩效比旁边员工高,那他的奖金也必须比旁边多。问最少要发多少奖金。 比如:
绩效:1 2 2
奖金:1 2 1
总数:4
最后一个 2 跟前一个 2 一样,不需要比它多。这里很多人会手一抖写成递增,直接发成 1 2 3 ,多发了。 这题真正麻烦的地方是:一个员工同时受左边和右边约束。 只从左往右扫一次,会漏掉右边的压力。
绩效:3 2 1
如果只看左边,大概率会发成:
奖金:1 1 1
明显不行,3 比 2 高,2 比 1 高,最后应该是:
奖金:3 2 1
所以我一般写两遍扫描。第一遍只处理“比左边高”的情况,第二遍再倒着处理“比右边高”的情况。第二遍不能直接覆盖,要取 max,不然会把第一遍已经满足的结果改坏。 代码就这么写,别整花活:
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {

    public static void main(String[] args) throws Exception {
        FastScanner fs = new FastScanner();

        int n = fs.nextInt();
        int[] score = new int[n];

        for (int i = 0; i < n; i++) {
            score[i] = fs.nextInt();
        }

        int[] bonus = new int[n];

        for (int i = 0; i < n; i++) {
            bonus[i] = 1;
        }

        for (int i = 1; i < n; i++) {
            if (score[i] > score[i - 1]) {
                bonus[i] = bonus[i - 1] + 1;
            }
        }

        for (int i = n - 2; i >= 0; i--) {
            if (score[i] > score[i + 1]) {
                bonus[i] = Math.max(bonus[i], bonus[i + 1] + 1);
            }
        }

        long total = 0;
        for (int money : bonus) {
            total += money;
        }

        System.out.println(total);
    }

    static class FastScanner {
        private final BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        private StringTokenizer st;

        int nextInt() throws Exception {
            while (st == null || !st.hasMoreTokens()) {
                st = new StringTokenizer(br.readLine());
            }
            return Integer.parseInt(st.nextToken());
        }
    }
}
这里 total 我用的是 long ,不是为了显得严谨,是这类题输入规模一大, int 真可能顶不住。尤其是绩效严格递增的时候,奖金是 1 + 2 + 3 + ... + n ,这个增长很快。 再看一个容易踩坑的例子:
绩效:1 3 4 5 2
第一遍扫完:
奖金:1 2 3 4 1
倒着看,5 比 2 高,已经是 4,不用改。最后答案就是 11。 这题别用排序,别用贪心乱跳,也别模拟一轮一轮调整。两次扫描就够了。 左边的账先算清,右边的账再补一遍,最后取个总数。这个思路比代码重要。