程序员老鬼

某大厂员工吐槽:领导给我介绍私活,让我赚了65万,为了报答请他吃饭,结果领导却要30万介绍费,我犹豫了,于是骗领导说只赚了48万

大厂这哥们的操作是:领导给他牵了个私活,赚了65万。按他的想法,请顿饭意思意思差不多了。

结果领导更直接,张口就要30万介绍费。

好家伙,这哪是领导,这是中介披了个工牌。然后他也不含糊,立马反手砍价,骗对方说自己只赚了48万,愿意拿18万出来,觉得自己这波血赚。

Image

我看这事最逗的不是谁更黑,是两边都把对方当算盘珠子拨。领导没拿你当自己人,你也没打算真感恩,嘴上说报答,心里已经开始做减法了。

职场里最怕这种半熟不熟的人情局,谈感情吧,全是价格;谈价格吧,又非要披一层“我是在帮你”的皮。最后这顿饭估计也别吃了,坐下去连菜单都像报价单。

面试题:上升的温度

这题表面上是 SQL,真做起来很多人会在细节上翻车。

题目叫“上升的温度”,意思不复杂:在 Weather 表里,找出当天温度比前一天高的那些记录 id。第一眼我一般不急着写子查询,先看两个点:一是“前一天”不是上一条数据,二是日期可能不连续。你要是直接拿 id 做减一对比,这题基本就已经写偏了。写这种题,先把“按日期关联自己”这个动作想明白,后面就顺了。整体写法和排查顺序,我会更偏现场感一点,不把题解写成教材。

先看表结构,通常是这样:

classWeatherRow{
int id;
    LocalDate recordDate;
int temperature;
}

真正关键不是 Java 代码本身,而是你脑子里要有这个映射:同一张表里,拿“今天”去匹配“昨天”。

SQL 最稳的一版,我一般就写自连接:

String sql = """
    select w1.id
    from Weather w1
    join Weather w2
      on w1.recordDate = date_add(w2.recordDate, interval 1 day)
    where w1.temperature > w2.temperature
    "
"";

这段的意思很直接:w1 是今天,w2 是昨天,日期正好差 1 天,且今天温度更高,就把今天这条记录的 id 查出来。

很多人会写成这样:

String wrongSql = """
    select id
    from Weather
    where temperature > (
        select temperature from Weather where id = Weather.id - 1
    )
    "
"";

这类写法问题很明显,id 连不连续题目没保证,id 相邻也不等于日期相邻。线上查数据我最烦这种“拿主键顺序冒充业务顺序”的写法,看起来像能跑,实际一碰脏数据就歪。

再补一个 Java 里自己模拟校验结果的小片段,面试时偶尔也能拿来解释思路:

List<WeatherRow> rows = loadRows();
Map<LocalDate, WeatherRow> byDate = rows.stream()
        .collect(Collectors.toMap(r -> r.recordDate, r -> r));

List<Integer> ans = new ArrayList<>();
for (WeatherRow cur : rows) {
    WeatherRow prev = byDate.get(cur.recordDate.minusDays(1));
if (prev != null && cur.temperature > prev.temperature) {
        ans.add(cur.id);
    }
}

这个写法其实已经把 SQL 思路翻成代码了:不是找“上一条”,是找“前一天那条”。

所以这题真正考的不是函数会不会写,而是你有没有把“日期连续性”和“数据关联键”看对。题不难,难的是别想当然。很多 SQL 题最后错,不是不会,是第一眼把关联条件看轻了。这个毛病,做几次线上排查就能改掉。