【笔试刷题】拼多多-2026.03.29-改编真题

✅ 春招备战指南 ✅

💡 学习建议:

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

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

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

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

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

拼多多-2026.03.29

拼多多-2026.03.29

这套题前两道更偏热身,第三题开始要把排序后的结构看清,第四题是整场分水岭。

第一题顺着过程模拟就能做完。第二题把课程关系看成森林,答案就是最大深度。

第三题的关键是发现一个背包在排序后一定对应连续区间,再把问题拆成两个不重叠区间。

第四题要把每一段接口抽成可以继续往右传递的状态,线性递推维护最优闭环长度。

题目一:小基 的货运巡线

一遍扫描就够。每次先更新载重,再判断当前位置是否安全,同时维护最长连续安全段。

容易漏掉的点是卸货操作。当前载重不够时,结果不是负数,而是直接清成

难度:Low

题目二:小基 的排课计划

每门课最多只有一门直接先修课,所以整张图就是若干棵树。

最长先修链给出了学期数下界;按深度分学期又能恰好达到这个下界,所以答案就是最大深度。

难度:Low

题目三:小基 的双背包选品

把价值排好序之后,一个合法背包一定对应一个连续区间。

先用双指针算出每个起点能取多远,再用后缀最优拼第二个背包,整体复杂度是

难度:Mid

题目四:小基 的 City Walk 环线

这题要从“图长什么样”往状态转。每次只关心当前两条连接边之间能留下多长的可延续结构。

当两个连接点重合时,旧状态无法继续往右接,只能重开;其余情况在“重开”和“延续”之间取更优值。

难度:High

1. 小基 的货运巡线

问题描述

小基 负责一条固定货运线路。线路上有 个连续途径点,卡车初始载重为 initialWeight,最大安全载重为 maxWeight

每个途径点会给当前载重带来一次变化:

  • 正数表示装货,载重增加。
  • 负数表示卸货,载重减少。
  • 如果一次卸货量超过当前载重,则本次卸货后载重记为

你需要计算:最长的连续途径点区间长度,使得卡车在该区间内每一步更新后的载重都不超过 maxWeight
如果不存在任何安全途径点,输出 -1

输入格式

第一行输入三个整数 initialWeightmaxWeightN

第二行输入 个整数 weights[i],表示第 个途径点对载重的影响。

输出格式

输出一个整数,表示满足安全要求的最长连续途径点个数。若不存在,输出 -1

样例输入

5 9 4
3 2 -4 3
5 7 3
3 1 2

样例输出

2
-1

数据范围

样例 解释说明
样例 1 载重变化依次为 ,安全状态对应第 个途径点,最长连续安全段为后两个点,长度是
样例 2 载重变化为 ,每一步都超过上限 ,因此输出

题解

这题可以直接按行驶顺序做一次线性模拟。

设当前载重为 cur。遍历每个途径点的变化量 x

  1. x >= 0,执行 cur += x
  2. x < 0,执行 cur = max(0, cur + x),对应“卸货超过当前载重则清空”。

每一步更新后只需要判断一次 cur <= maxWeight

  • 若成立,当前安全连续段长度 run 加一,并更新答案 best
  • 若不成立,安全连续段被打断,run 置零。

遍历结束后:

  • 如果 best > 0,输出 best
  • 否则说明没有任何安全途径点,输出 -1

正确性说明

载重变化是按顺序逐点发生的,且每个点只依赖“前一时刻载重 + 当前变化量”,不存在回溯或分支选择。
因此线性扫描得到的 cur 序列就是题目定义下的真实载重序列。

安全条件同样是逐点判定。run 恰好维护“以当前位置结尾的最长安全连续后缀长度”,best 维护历史最大值。
当遇到不安全点时把 run 归零,正好对应连续段被打断。
所以最终 best 就是最长安全连续途径点个数。

复杂度分析

  • 时间复杂度:
  • 空间复杂度:(不计输入数组时)。

参考代码

  • Python
import sys
input = lambda:sys.stdin.readline().strip()


def solve():
    ini, lim, n = map(int, input().split())
    arr = list(map(int, input().split()))

    cur = ini
    run = 0
    bst = 0

    for x in arr:
        # 先按题意更新当前载重。
        if x >= 0:
            cur += x
        else:
            cur += x
            if cur < 0:
                cur = 0

        # 再判断当前位置是否安全,维护最长连续安全段。
        if cur <= lim:
            run += 1
            if run > bst:
                bst = run
        else:
            run = 0

    print(bst if bst > 0 else -1)


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

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

    long long ini, lim;
    int n;
    cin >> ini >> lim >> n;

    long long cur = ini;
    int run = 0, bst = 0;

    for (int i = 0; i < n; ++i) {
        long long x;
        cin >> x;

        // 按题意更新载重,负载重会被截断为 0。
        if (x >= 0) {
            cur += x;
        } else {
            cur += x;
            if (cur < 0) cur = 0;
        }

        // 维护“以当前点结尾”的连续安全长度。
        if (cur <= lim) {
            ++run;
            if (run > bst) bst = run;
        } else {
            run = 0;
        }
    }

    cout << (bst > 0 ? bst : -1) << '\n';
    return 0;
}
  • Java
import java.io.IOException;
import java.io.InputStream;

public class Main {
    static class Fs {
        private final InputStream in = 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++];
        }

        int nextInt() throws IOException {
            int c;
            do {
                c = read();
            } while (c <= ' ' && c != -1);

            int sgn = 1;
            if (c == '-') {
                sgn = -1;
                c = read();
            }

            int v = 0;
            while (c > ' ') {
                v = v * 10 + (c - '0');
                c = read();
            }
            return v * sgn;
        }
    }

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

        long ini = fs.nextInt();
        long lim = fs.nextInt();
        int n = fs.nextInt();

        long cur = ini;
        int run = 0, bst = 0;

        for (int i = 0; i < n; i++) {
            long x = fs.nextInt();

            // 更新载重,若小于 0 则清空。
            cur += x;
            if (cur < 0) cur = 0;

            // 维护连续安全段长度与全局最大值。
            if (cur <= lim) {
                run++;
                if (run > bst) bst = run;
            } else {
                run = 0;
            }
        }

        System.out.println(bst > 0 ? bst : -1);
    }
}

2. 小基 的排课计划

问题描述

学校共有 门课程,编号为
对每门课程 ,给出一个直接先修课 p_i

  • p_i = -1 表示课程 没有直接先修课。
  • 否则 p_i 表示课程 的直接先修课编号。

先修关系按传递闭包定义:如果 的直接先修课,或 的某个直接先修课的先修课,那么 都是 的先修课。

现在需要把全部课程分配到若干学期。
同一学期中,任意两门课都不能存在先修关系。
请计算最少需要多少个学期。

已保证不存在环依赖,且 p_i != i

输入格式

第一行输入一个整数

接下来 行,第 行输入一个整数 p_i

输出格式

输出一个整数,表示最少学期数。

样例输入

5
-1
1
2
1
-1

样例输出

3

数据范围

  • p_i != i
  • 输入保证无环
样例 解释说明
样例 1 课程链 的长度为 ,因此至少要 个学期。一个可行安排是第 学期上 ,第 学期上 ,第 学期上

题解

每门课只有至多一个直接先修课,因此整张图是若干棵有向树(森林),边方向是“先修课指向后继课”。

同一学期不能放一对存在先修关系的课程。
这意味着:沿着任意一条先修链,链上课程必须分到不同学期。
所以最少学期数至少是“最长先修链长度”。

另一方面,如果把每门课分配到“它在先修树中的深度层”:

  • 根节点(没有先修课)在第 学期。
  • 子节点在父节点学期加一。

就能保证一门课总在其所有先修课之后,且同一深度的两门课互不为祖先后代,可以同学期上。
所以这个分配是可行的,学期数恰好等于最大深度。

因此答案就是:所有课程中最大深度。

状态定义

dep[i] 为课程 的深度:

  • p_i = -1,则 dep[i] = 1
  • 否则 dep[i] = dep[p_i] + 1

对每个课程求一次 dep[i],取最大值即答案。

复杂度分析

  • 时间复杂度:
  • 空间复杂度:

参考代码

  • Python
import sys
input = lambda:sys.stdin.readline().strip()


def solve():
    n = int(input())
    par = [0] * (n + 1)
    for i in range(1, n + 1):
        x = int(input())
        par[i] = 0 if x == -1 else x

    dep = [0] * (n + 1)

    def get(u):
        # 用迭代方式求深度,避免重复递归。
        if dep[u] != 0:
            return dep[u]

        st = []
        v = u
        while v != 0 and dep[v] == 0:
            st.append(v)
            v = par[v]

        # v==0 表示走到根之前;否则 dep[v] 已知。
        cur = 0 if v == 0 else dep[v]
        while st:
            x = st.pop()
            cur += 1
            dep[x] = cur
        return dep[u]

    ans = 0
    for i in range(1, n + 1):
        d = get(i)
        if d > ans:
            ans = d

    print(ans)


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

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

    int n;
    cin >> n;

    vector<int> par(n + 1), dep(n + 1, 0);
    for (int i = 1; i <= n; ++i) {
        int x;
        cin >> x;
        par[i] = (x == -1 ? 0 : x);
    }

    function<int(int)> dfs = [&](int u) -> int {
        // dep[u] 记忆化后不再重复计算。
        if (dep[u] != 0) return dep[u];
        if (par[u] == 0) return dep[u] = 1;
        return dep[u] = dfs(par[u]) + 1;
    };

    int ans = 0;
    for (int i = 1; i <= n; ++i) {
        ans = max(ans, dfs(i));
    }

    cout << ans << '\n';
    return 0;
}
  • Java
import java.io.IOException;
import java.io.InputStream;

public class Main {
    static class Fs {
        private final InputStream in = 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++];
        }

        int nextInt() throws IOException {
            int c;
            do {
                c = read();
            } while (c <= ' ' && c != -1);

            int sgn = 1;
            if (c == '-') {
                sgn = -1;
                c = read();
            }

            int v = 0;
            while (c > ' ') {
                v = v * 10 + (c - '0');
                c = read();
            }
            return v * sgn;
        }
    }

    static int[] par;
    static int[

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

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

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

全部评论

相关推荐

03-29 18:21
已编辑
北京科技大学 人工智能
岗位:大模型算法四道编程&nbsp;&nbsp;做了三道&nbsp;&nbsp;第四道两眼一黑第一题:有一辆货车,途径N个站点,车上初始货物量为initiaWeight,最大限额是maxWeight,每个站点要么装货(整数),如果装货之后大于最大限额就是危险了,比如说你现在车上6个,这一站要装4个,最大是9,6+4&gt;9就不行,但是等于9是可以的,要么卸货(负数),如果目前装在的货物小于卸货要求,直接全部卸下,就是比如说你现在车上3个货物,这一站要写下来4个(-4),3-4=-1嘛不是,但是不可能没有硬卸,变为0就行,问你在安全装载状态下最长能连续经过几个站点非常简单的题,一遍96%,就没看了,直接下一道了第二道:有n门课,每门课有一个先修课,比如说2的先修课是1,那修完1才能修2,给你n门课的先修课序列,问你修完n门课要几学期,举个栗子:5门课&nbsp;&nbsp;-1&nbsp;1&nbsp;2&nbsp;1&nbsp;-1(-1表示没有先修课)下标:&nbsp;A&nbsp;B&nbsp;C&nbsp;D&nbsp;E&nbsp;(为了不弄混,我先用字母表示)这个就是需要三个学期,第一学期:A和E,第二学期:B和D,第三学期:C这道题,怎么说呢,看到先修课我以为是输出拓扑排序,昨天才笔了一样的,结果写到一半发现不对,然后又重新写,然后这个序列是从1开始的,这个又浪费我好几轮,然后还有一开始理解错了,我以为序列是先修课有几个,比如说这个2,我本来以为是C的先修课有两个,我心想,那不就是3吗?选最大的+1得了呗,过了80%,我都傻了,后来发现我写的逻辑完全不是人家说的,最后是用了一个数组,先初始化为0&nbsp;,然后遍历,比如说A不需要先修课,那就是0,然后B要先修A,就是0(A的先修)+1,C要先修B,那就是1(B的先修)+1,这样然后遍历数组找到麻小,输出max+1应该是很简单的题,我先入为主浪费好多时间,最后是100%第三题有N个奖品,价值为vi,有俩包,一个物品只能放进一个包里,然后一个包里的奖品就,任意两个之间的价值差不能超过T,问你最多俩包能装多少奖品我用的最笨的方法——暴力&nbsp;&nbsp;但是可能我的逻辑写的不对,只有15%然后换了一种N=6&nbsp;&nbsp;T=3vi:&nbsp;5&nbsp;4&nbsp;2&nbsp;1&nbsp;8&nbsp;10先sort排序——1&nbsp;2&nbsp;4&nbsp;5&nbsp;8&nbsp;10算从1开始,一个包能装多少,那就是&nbsp;1&nbsp;2&nbsp;4,下标就是0&nbsp;1&nbsp;2,用了一个end数组,end[0]=2——记录从下表为0的奖品开始,能装的最后一个奖品的下标end[0]=2&nbsp;——&nbsp;一个包能装3个&nbsp;&nbsp;包1end[1]=3&nbsp;——&nbsp;一个包能装3个&nbsp;&nbsp;包2end[2]=3&nbsp;——&nbsp;2个&nbsp;&nbsp;包3end[3]=4&nbsp;——&nbsp;2个&nbsp;&nbsp;包4end[4]=5&nbsp;——&nbsp;2个&nbsp;&nbsp;&nbsp;包5end[5]=5&nbsp;——&nbsp;1个&nbsp;&nbsp;包6如果我选了包1,那么保证一个奖品不能出现在同一个包里,包2和3就不能选,然后选剩下包里最多的,这就是从奖品0开始装,最多能装多少,然后取最大有点饶了,我比较菜,正能想到这个方法了,只有60%第四题一笔画,且点不重复的情况下,在一幅图里最多从起到回到起点,最多一笔画能包含几个点手画个图,凑活看吧题目是说要city&nbsp;walk,实线是主干道,虚线是小路(P1),然后让你规划路线,答案是P2
熙里咕噜:第三题我先对v数组排序,然后用一个两层的循环去维护一个数组arr,arr[i]代表以第i个物品为起点,一个背包最多塞几个物品,因为排过序所以很好找,只要遍历到第j个元素满足vj-vi>t就arr[i]=j-i,然后break,以此类推。然后下面再用两层循环更新答案,第一层循环表示第一个框的起点,第二层循环表示第二个框的起点,第一层循环是i=0开头,第二层循环是j=i+arr[i]开头,ans和arr[i]+arr[j]的和比大小,选择大的更新答案。最后考虑一个背包就能装下所有物品的特殊案例就能AC
查看4道真题和解析
点赞 评论 收藏
分享
昨天 20:12
已编辑
东南大学 C++
一、自我介绍&nbsp;/&nbsp;基本情况&nbsp;/&nbsp;求职意向1.你先做一下简单的自我介绍。2.你在字节实习了多久?3.你怎么进去的?是自己找的,还是同学内推之类的?4.你在字节主要做了什么?5.第一个点是缓存特征优化,这块做了多久?6.这是你一个人做的,还是有人带着你做的?7.代码大部分都是你写的吗?8.你平时主要用什么开发语言?二、C++&nbsp;智能指针&nbsp;/&nbsp;内存管理10.你们用的什么智能指针?是哪一种?11.你说的这个智能指针,实现原理是什么?12.shared_ptr&nbsp;用过吗?13.shared_ptr&nbsp;的实现原理是什么?14.它和你刚刚说的unique_ptr指针有什么区别?15.shared_ptr&nbsp;是线程安全的吗?16.多线程去用它或者改它呢?17.你怎么证明没有内存泄漏?三、concurrent&nbsp;hashmap&nbsp;/&nbsp;容器&nbsp;/&nbsp;并发结构18.你简历里写的&nbsp;concurrent&nbsp;hashmap,是&nbsp;STL&nbsp;里面的吗?19.它怎么做的?20.它的锁是什么?21.这个&nbsp;hashmap&nbsp;是整张表一把锁吗?四、实习项目:缓存优化&nbsp;/&nbsp;指标&nbsp;/&nbsp;SQL&nbsp;优化22.你这里写&nbsp;Android&nbsp;优化&nbsp;4.8%,这个是什么情况下的?23.你们这个模块本身优化了多少?24.这个优化结果你们取的是平均值,还是&nbsp;P99?25.你们是怎么测的?测了多少台设备?26.你第二个点写的是&nbsp;SQL&nbsp;重复优化,这个我没太看明白。你讲一下。27.你们这个不是用缓存来优化,而是在实现方式上优化,是吗?28.你们缓存的话,怎么控制过期时间?29.如果两次查询一模一样,命中了缓存,就不再到底层查了,是吗?五、右值引用&nbsp;/&nbsp;移动语义&nbsp;/&nbsp;构造函数class&nbsp;Stringpublic:String(const&nbsp;String&nbsp;&amp;p)&nbsp;{}String(String&nbsp;&amp;&amp;p){}private:char&nbsp;*s;int&nbsp;size;}32.你对右值引用了解吗?33.右值引用的原理是什么?34.它是在编译期还是运行时生效?35.那你把拷贝构造和移动构造写一下吧。36.String(const&nbsp;String&nbsp;&amp;p)&nbsp;应该怎么写?37.String(String&nbsp;&amp;&amp;p)&nbsp;应该怎么写?38.拷贝构造和移动构造的区别是什么?39.为什么移动构造里要把源对象置空?40.这里如果只做浅拷贝,会有什么问题?41.这个类需不需要析构函数?为什么?42.如果有析构函数,这个类还应不应该补赋值运算符重载?六、编程题:三个有序数组合并43.有三个已经排好序的数组,现在要把它们合成一个有序数组。44.除了结果本身,额外空间复杂度要求&nbsp;O(1),你怎么做?45.你这个方案(三指针)的时间复杂度是多少?46.如果三个数组长度分别是&nbsp;m、n、k,时间复杂度怎么表示?47.如果三个数组长度都记作&nbsp;N,那复杂度是多少?48.如果我把约束去掉,不限制你额外空间,要求时间尽量快,你会怎么做?49.你为什么会想到优先队列?50.重新放到堆里为什么不一定更快?51.如果我再告诉你,这些&nbsp;int&nbsp;数值的取值范围是固定的,你有没有更快一点的方法?52.图里写的&nbsp;mergeAll(const&nbsp;vector&lt;vector&lt;int&gt;&gt;&amp;&nbsp;inputs)&nbsp;这种两两合并思路,整体复杂度是多少?七、估算题60.假设上海每年出生人口大概&nbsp;16&nbsp;万,你估一下上海大概有多少所小学。
点赞 评论 收藏
分享
昨天 00:09
吉林大学 C++
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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