【笔试刷题】滴滴-2026.03.08-改编真题

✅ 秋招备战指南 ✅

💡 学习建议:

  • 先尝试独立解题
  • 对照解析查漏补缺

🧸 题面描述背景等均已深度改编,做法和题目本质基本保持一致。

🍹 感谢各位朋友们的订阅,你们的支持是我们创作的最大动力

🌸 目前本专栏已经上线180+套真题改编解析,后续会持续更新的

春秋招笔试机考招合集 -> 互联网必备刷题宝典🔗

滴滴-2026.03.08

这套滴滴题是很典型的“两道题都要先把问题压扁”的组合。

第一题表面上是在问很多个阈值下的统计结果,真正该抓的是“最终到底出现了哪些正高度”;第二题表面上是三元组计数,真正该做的是固定前两个量后一次算完第三个量的贡献。

题目 1:仓储层位观测

这题的关键不在于把每个 都算出来,而在于意识到答案只和“出现过多少种正高度”有关。

一旦把这一点想清楚,后面就是标准的区间加离散化:把所有会改变高度的端点抠出来,再在压缩后的坐标上做差分。

题目 2:三路投放方案统计

真正的突破口是把三层枚举降成两层。固定 之后, 的可选范围可以直接由两个上界取最小值。

难点主要在复杂度判断。看到 的上界大约是 以后,就知道总枚举次数是一段调和级数,这题就落回了可做范围。

1. 仓储层位观测

问题描述

K 小姐在整理一条很长的仓储通道。通道里一共有 个货位,编号为 。一开始,每个货位上都没有箱子。

接下来会有 批补货。第 批补货会把 个相同的箱子,同时加到编号位于 的每一个货位上。于是,所有补货结束后,每个货位都会得到一个最终高度。

现在定义函数 表示:最终高度 大于等于 的货位有多少个。

K 小姐不关心 的具体变化过程,她只想知道:当 一直取到很大的值时, 一共会出现多少种不同的取值。

输入格式

第一行输入两个整数 ,分别表示货位数量与补货批次数。

接下来有 行,每行输入三个整数 ,表示这一批补货会让区间 中的每个货位高度增加

输出格式

输出一个整数,表示 这一长串数值里,不同取值的总个数。

样例输入

10 4
7 8 5
5 7 5
1 2 1
3 5 3

样例输出

6

数据范围

样例 解释说明
样例 1 最终高度依次为 。正高度只有 种,所以 会出现 种不同取值,最后那个 来自所有货位都不够高时的

题解

真正麻烦的地方,不是去算某一个固定的 ,而是要看它一共会变化出多少个不同答案。

先盯住“什么时候会变”。假设某个货位的最终高度是 ,那么当阈值 从小到大增加时,这个货位会在 的那一刻从统计里消失。在别的位置,它对 没影响。于是, 只会在“跨过某个真实出现过的正高度”时发生变化。

这就得到一个非常关键的结论:答案其实等于“最终所有货位里,正高度有多少种不同取值”再加上 。多出来的这个 ,对应的是阈值继续升高后,所有货位都被删空,此时

所以题目被改写成:想办法找出所有 出现过的不同正高度

问题又来了, 最大能到 ,显然不可能真的把每个货位都算出来。这里要利用区间加的结构:所有变化只会发生在每次补货的左端点 ,以及右端点后一位 。把这些位置和边界 全部收集起来、排序去重后,相邻两个坐标之间的整段货位,最终高度一定相同。这样一来,本来可能有 个位置,现在只剩下不超过 个关键分界点。

接着在压缩后的坐标上做差分。对一条操作 加上 ,只需要在 对应的位置加上 ,在 对应的位置减去 。最后扫一遍前缀和,就能得到每个压缩段的真实高度。

扫的过程中,不需要记录整段有多长,因为题目只问“出现过哪些高度”,而不是每个高度出现了多少次。只要某一段的高度大于 ,就把这个高度丢进集合里。集合大小记为 ,最终答案就是

为什么这样做一定正确?原因分两步:

第一,坐标压缩不会丢信息。因为任意两个相邻关键点之间,再也没有操作端点穿过,所以这一整段货位经历的所有补货完全一样,最终高度当然也完全一样。

第二,答案和不同正高度的个数一一对应。若正高度从小到大是 ,那么当阈值依次跨过 时,至少会有一批货位退出统计, 会严格下降;而在两个相邻高度之间,满足“高度至少为 ”的货位集合并不会变化。因此, 的不同取值正好是这 次下降形成的 个值,再加上最后的 ,总数就是

复杂度方面,坐标数不超过 。排序和每次二分定位的总复杂度是 ,扫前缀和是 ,空间复杂度也是 。在 的范围内完全可以通过。

参考代码

  • Python
import sys
from bisect import bisect_left

input = lambda: sys.stdin.readline().strip()


def main():
    n, m = map(int, input().split())

    # 收集所有会改变高度的关键位置。
    pos = [1, n + 1]
    ops = []
    for _ in range(m):
        l, r, d = map(int, input().split())
        rp = r + 1
        ops.append((l, rp, d))
        pos.append(l)
        pos.append(rp)

    # 坐标压缩后,相邻关键点之间的整段高度相同。
    pos = sorted(set(pos))
    dif = [0] * (len(pos) + 1)

    def idx(val):
        # 找到原坐标在压缩数组中的位置。
        return bisect_left(pos, val)

    for l, rp, d in ops:
        dif[idx(l)] += d
        dif[idx(rp)] -= d

    cur = 0
    seen = set()
    for i in range(len(pos) - 1):
        # 前缀和就是当前压缩段的真实高度。
        cur += dif[i]
        if cur > 0:
            # 只关心“出现过哪些正高度”,长度无关紧要。
            seen.add(cur)

    # 多出来的 1,对应阈值足够大时的 f(x)=0。
    print(len(seen) + 1)


if __name__ == "__main__":
    main()
  • Cpp
#include <bits/stdc++.h>
using namespace std;

using ll = long long;

int get_id(const vector<ll>& pos, ll val) {
    return lower_bound(pos.begin(), pos.end(), val) - pos.begin();
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    ll n;
    int m;
    cin >> n >> m;

    vector<ll> pos;
    pos.reserve(m * 2 + 2);
    pos.push_back(1);
    pos.push_back(n + 1);

    vector<array<ll, 3>> ops;
    ops.reserve(m);

    for (int i = 0; i < m; ++i) {
        ll l, r, d;
        cin >> l >> r >> d;
        ll rp = r + 1;
        ops.push_back({l, rp, d});
        pos.push_back(l);
        pos.push_back(rp);
    }

    // 压缩所有关键坐标,减少需要真正扫描的位置数。
    sort(pos.begin(), pos.end());
    pos.erase(unique(pos.begin(), pos.end()), pos.end());

    // dif 记录压缩坐标上的差分变化量。
    vector<ll> dif(pos.size() + 1, 0);
    for (const auto& op : ops) {
        int l_id = get_id(pos, op[0]);
        int r_id = get_id(pos, op[1]);
        dif[l_id] += op[2];
        dif[r_id] -= op[2];
    }

    ll cur = 0;
    set<ll> seen;
    for (size_t i = 0; i + 1 < pos.size(); ++i) {
        // 每个压缩段里的所有货位,高度完全一致。
        cur += dif[i];
        if (cur > 0) {
            seen.insert(cur);
        }
    }

    // 不同正高度个数 + 1,就是答案。
    cout << static_cast<ll>(seen.size()) + 1 << '\n';
    return 0;
}
  • Java
import java.io.BufferedInputStream;
import java.io.IOException;
import java.util.Arrays;
import java.util.TreeSet;

public class Main {
    static class FastScanner {
        private final BufferedInputStream in = new BufferedInputStream(System.in);
        private final byte[] buf = new byte[1 << 16];
        private int len = 0;
        private int ptr = 0;

        private int read() throws IOException {
            if (ptr >= len) {
                len = in.read(buf);
                ptr = 0;
                if (len <= 0) {
                    return -1;
                }
            }
            return buf[ptr++];
        }

        long nextLong() throws IOException {
            int c;
            do {
                c = read();
            } while (c <= ' ');

            lo

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

互联网刷题笔试宝典 文章被收录于专栏

互联网刷题笔试宝典,这里涵盖了市面上大部分的笔试题合集,希望助大家春秋招一臂之力

全部评论

相关推荐

xtu大迫杰:偶遇校友,祝校友offer打牌
点赞 评论 收藏
分享
刚刷到字节跳动官方发的消息,确实被这波阵仗吓了一跳。在大家还在纠结今年行情是不是又“寒冬”的时候,字节直接甩出了史上规模最大的转正实习计划——ByteIntern。咱们直接看几个最硬的数,别被花里胡哨的宣传词绕晕了。首先是“量大”。全球招7000多人是什么概念?这几乎是把很多中型互联网公司的总人数都给招进来了。最关键的是,这次的资源分配非常精准:研发岗给了4800多个Offer,占比直接超过六成。说白了,字节今年还是要死磕技术,尤其是产品和AI领域,这对于咱们写代码的同学来说,绝对是今年最厚的一块肥肉。其次是大家最关心的“转正率”。官方直接白纸黑字写了:整体转正率超过50%。这意味着只要你进去了,不划水、正常干,每两个人里就有一个能直接拿校招Offer。对于2027届(2026年9月到2027年8月毕业)的同学来说,这不仅是实习,这简直就是通往大厂的快捷通道。不过,我也得泼盆冷水。坑位多,不代表门槛低。字节的实习面试出了名的爱考算法和工程实操,尤其是今年重点倾斜AI方向,如果你简历里有和AI相关的项目,优势还是有的。而且,转正率50%也意味着剩下那50%的人是陪跑的,进去之后的考核压力肯定不小。一句话总结:&nbsp;27届的兄弟们,别犹豫了。今年字节这是铁了心要抢提前批的人才,现在投递就是占坑。与其等到明年秋招去千军万马挤独木桥,不如现在进去先占个工位,把转正名额攥在手里。
喵_coding:别逗了 50%转正率 仔细想想 就是转正与不转正
哪些公司开暑期实习了?
点赞 评论 收藏
分享
昨天 17:51
已编辑
华南师范大学 Java
一面:2026.3.21.&nbsp;自我介绍(面试官人很好&nbsp;介绍的时候很认真听&nbsp;会表达肯定)2.&nbsp;简单闲聊了一会&nbsp;面试官说有看过我的github(简历里面项目带了链接)和博客&nbsp;然后问我是不是平时比较喜欢熬夜&nbsp;然后项目也是跟着学习的(有看到痕迹&nbsp;不过我在自我介绍的时候就说明了&nbsp;所以没啥问题)3.然后大概就是问了平时如何学习的&nbsp;怎么使用ai编程工具的&nbsp;使用过哪些&nbsp;有没有了解过dify&nbsp;n8n(直接说没了解)&nbsp;除了shardingsphere还用过哪些分库分表插件4.&nbsp;RAG相关(项目里用到了RAG)-&nbsp;大模型怎么进行上下文存储(ChatMemory)-&nbsp;RAG文档怎么进行分块的&nbsp;怎么解决分块后上下文语义割裂问题(TokenTextSpliter滑动窗口)-&nbsp;向量库中怎么进行关键词检索(增加元数据)-&nbsp;混合检索怎么做的&nbsp;(es+向量库)-&nbsp;重排序怎么做的&nbsp;(RRF)&nbsp;怎么进行排名-&nbsp;为什么要进行检索&nbsp;直接塞给大模型不可以吗(烧钱+迷失现象)-&nbsp;讲讲Transformer注意力机制可能这家公司是做全文检索+AI的&nbsp;这一块问的比较多5.&nbsp;说说IOC和AOP(一开始有点卡壳&nbsp;面试官让我不用这么官方&nbsp;根据日常使用感受说说是个什么东西就可以)-&nbsp;AOP的切面怎么去理解-&nbsp;对于异常&nbsp;AOP怎么去捕捉的6.&nbsp;Linux和计网-&nbsp;Linux中怎么去查看内存占用率-&nbsp;讲讲https然后面试就结束了&nbsp;大概20分钟&nbsp;没有算法&nbsp;面试结束后面试官就说等hr消息准备下一轮面试吧整体面试感觉非常好&nbsp;答题的时候面试官会给予肯定(虽然我感觉我说的并不那么好)然后遇到卡壳或者不那么肯定的地方面试官也不会去追问&nbsp;面试体验最好的一次了二面&nbsp;3.4&nbsp;经理面就简单自我介绍&nbsp;说说遇到最难解决的问题是什么&nbsp;怎么使用ai优化现有代码&nbsp;喜欢什么样的工作氛围&nbsp;对于加班怎么看&nbsp;多个任务很紧急让你做但是做不完怎么处理大概十分钟左右就结束了面试结束十分钟就收到hr的oc信息(感觉有点太顺了是怎么回事)想问一下有在这家公司入职过的友友吗&nbsp;工作环境和实习生待遇怎么样&nbsp;加班多吗&nbsp;(网上找不太到相关的信息&nbsp;但是入职的员工好像评价不是很好&nbsp;但这家起码是个上市公司&nbsp;自研产品,不是外包并且我感觉目前接触到的几位都挺友好的而且我是第一段实习&nbsp;应该是确定入职这家了)
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务