滴滴笔试 滴滴笔试题 20260315滴滴笔试真题解析

笔试时间:2026年3月15日

往年笔试合集:

2023春招秋招笔试合集

2024春招秋招笔试合集

第一题:划分(MEX 最小值最大化)

难度: 中等

题目描述

给定一个长度为 n 的数组 a 和一个整数 k。需要将整个数组划分成恰好 k 个连续子数组,每个子数组至少包含一个元素。

对一个数组 a\text{MEX}(a) 表示没有出现在其中的最小非负整数。在所有可能的划分中,定义:

\text{ans} = \min_{i=1}^{k} \text{MEX}(a_i)

其中 a_i 为划分得到的子数组。你的任务是使 \text{ans} 尽量大,并求出能达到的最大值。

MEX 定义:\text{MEX} 指在数组中没有出现过的最小非负整数。示例:

  • \text{MEX}(\{0, 1, 2\}) = 3
  • \text{MEX}(\{1, 2, 3\}) = 0
  • \text{MEX}(\{0, 2, 4\}) = 1

输入描述

第一行包含两个整数 n, k1 \le k \le n),表示数组长度和要划分的子数组个数;第二行包含 n 个整数 a_i0 \le a_i \le n),表示数组的元素。

输出描述

输出一行,一个整数,表示在某种将数组划分成 k 个子数组的方式下,最大可能值 \text{ans}

样例输入

6 2
0 0 1 1 2 2

样例输出

1

参考题解

解题思路:

首先注意到所求的这个 \text{ans} 是满足单调性的,也就是大的 \text{ans} 能达到,那么更小的一定能达到,那么考虑二分答案。对于给定的 \text{mid},通过贪心验证是否能将数组划分为 k 个连续子数组,且每个子数组的 MEX 都 \ge \text{mid}。具体做法是从左往右遍历数组,用 set 来维护当前的 mex,如果当前 mex \ge \text{mid} 了就划分一次,最后看能不能划分出 k 个子数组。

C++:

#include <bits/stdc++.h>
using namespace std;

vector<int> a;
int n, k;

bool check(int mid) {
    if (!mid) return true;
    set<int> s;
    int cnt = 0;
    for (int x : a) {
        if (x < mid) s.insert(x);
        if (s.size() == mid) cnt++, s.clear();
    }
    return cnt >= k;
}

int main() {
    cin >> n >> k;
    a.resize(n);
    for (int i = 0; i < n; i++) cin >> a[i];
    int l = 0, r = n, ans = 0;
    while (l <= r) {
        int mid = (l + r) / 2;
        if (check(mid)) ans = mid, l = mid + 1;
        else r = mid - 1;
    }
    cout << ans;
}

Java:

import java.util.*;

public class Main {
    static int[] a;
    static int n, k;

    static boolean check(int mid) {
        if (mid == 0) return true;
        Set<Integer> s = new HashSet<>();
        int cnt = 0;
        for (int x : a) {
            if (x < mid) s.add(x);
            if (s.size() == mid) {
                cnt++;
                s.clear();
            }
        }
        return cnt >= k;
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        n = sc.nextInt();
        k = sc.nextInt();
        a = new int[n];
        for (int i = 0; i < n; i++) a[i] = sc.nextInt();
        int l = 0, r = n, ans = 0;
        while (l <= r) {
            int mid = (l + r) / 2;
            if (check(mid)) {
                ans = mid;
                l = mid + 1;
            } else {
                r = mid - 1;
            }
        }
        System.out.println(ans);
    }
}

Python:

import sys
input = sys.stdin.readline

def check(mid, a, k):
    if mid == 0:
        return True
    s = set()
    cnt = 0
    for x in a:
        if x < mid:
            s.add(x)
        if len(s) == mid:
            cnt += 1
            s.clear()
    return cnt >= k

def main():
    n, k = map(int, input().split())
    a = list(map(int, input().split()))
    l, r, ans = 0, n, 0
  

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

2025 春招笔试合集 文章被收录于专栏

2025打怪升级记录,大厂笔试合集 C++, Java, Python等多种语言做法集合指南

全部评论

相关推荐

昨天 13:00
已编辑
中国地质大学(北京) Java
围绕项目,无八股算法部署服务的方式pod&nbsp;最大多少个:高峰期7k&nbsp;QPS:&nbsp;20到30个&nbsp;Pod每个pod占用的资源:API&nbsp;查询和任务消费/回调合并在一个&nbsp;Pod&nbsp;内,这类&nbsp;Pod&nbsp;既有高并发读流量,又有异步写和状态更新,也就是2C4G&nbsp;request,4C8G&nbsp;limit。分表的分页表怎么做有没有更好的方案&nbsp;&nbsp;从产品思维:根据用户会员等级,限制用户查询的数量。加入缓存遇到了哪些问题:数据的不一致性问题,具体来说,当回调主动更改缓存任务状态时,有可能更改失败,因为mysql和redis的更新不在一个事务内,这个时候ttl就发挥了作用,视频生成的平均时长是2到3分钟,ttl设置为3分钟,当任务过期就被清楚,从数据库取出最新的数据,保证了redis和缓存的一致性消费者怎么回调:消费者回调通过rpc的方式回调我们的服务,传入状态和视频结果等信息,我们的服务去更新数据库和缓存服务之间调用的输入输出&nbsp;&nbsp;用了&nbsp;rpc&nbsp;的什么协议调用的:百度内部常见的&nbsp;RPC&nbsp;框架是&nbsp;brpc。它底层一般跑在&nbsp;TCP&nbsp;之上,消息序列化常用&nbsp;protobuf;协议层不是只有一种,百度内部常见有&nbsp;baidu_std&nbsp;等私有协议,brpc&nbsp;同时也兼容&nbsp;HTTP、gRPC、Thrift&nbsp;等多种协议。HTTP&nbsp;协议通常把数据组织成请求报文和响应报文。无论请求还是响应,整体结构都是请求行、头部、空行和消息体。起始行用来说明请求方法、路径、版本,或者响应状态码;头部用&nbsp;key-value&nbsp;的形式描述元信息,比如内容类型、长度、认证信息;空行用来分隔头部和消息体;消息体里才是真正的业务数据,比如&nbsp;JSON、表单或者二进制文件。因为底层&nbsp;TCP&nbsp;是字节流,没有消息边界,所以&nbsp;HTTP&nbsp;还会通过&nbsp;Content-Length&nbsp;或&nbsp;chunked&nbsp;机制来标识消息体长度。rpc和http的区别我的理解是,HTTP&nbsp;和&nbsp;RPC&nbsp;的核心区别在于抽象层次不同。HTTP&nbsp;是一种通用的应用层通信协议,通常是面向&nbsp;URL&nbsp;和资源来设计接口;而&nbsp;RPC&nbsp;是一种远程调用模型,目标是让调用远程服务像调用本地方法一样。在使用场景上,HTTP&nbsp;更适合前后端交互和对外开放接口,因为标准统一、通用性强;RPC&nbsp;更适合内部微服务调用,因为通常会结合二进制序列化、长连接和服务治理能力,在性能和调用效率上更有优势。不过两者不是完全对立的,因为&nbsp;RPC&nbsp;也可以基于&nbsp;HTTP&nbsp;来实现,比如&nbsp;gRPC&nbsp;就是基于&nbsp;HTTP/2。在这个项目中的一些不足和经验我觉得这个项目有两个比较明显的不足。第一,前期方案选型时,我们基于当时的成本、风险和收益考虑,选择了缓存方案,这个决策在当时是合理的,能快速支撑业务上线。但后面随着流量增长,我发现轮询查缓存的方式扩展性有限,后续更适合往服务端主动推送的方向演进。这个经历让我意识到,技术方案要结合业务阶段做取舍,也要提前考虑后续架构升级路径。第二,项目里对慢&nbsp;SQL&nbsp;的监控还不够完善,缺少及时报警机制。这样会导致数据库性能问题不能第一时间暴露。后来我复盘时觉得,除了完成功能,线上监控和告警体系也非常重要,尤其是慢&nbsp;SQL、接口耗时和错误率这类指标,应该尽早纳入日常治理。所以这个项目最大的收获是,我现在做项目不只关注功能实现,还会更关注方案演进能力,以及系统上线后的监控和稳定性建设未来技术规划我对未来的职业规划,现阶段还是希望先立足于技术成长。短期内,我希望先把基础打扎实,不只是把功能做出来,而是真正理解业务,提升自己在代码质量、系统设计、问题排查和工程规范上的能力。中期的话,我希望能参与更有挑战性的项目,比如高并发场景、微服务架构、性能优化这类方向。因为我觉得这些场景能更快锻炼一个工程师的技术深度和系统性思维。长期来看,我希望自己不仅能解决具体技术问题,也能独立负责一个模块,能够把业务理解和技术实现结合起来,做一个既懂技术、也能真正支撑业务发展的工程师。反问:未来一年最大的技术挑战
查看13道真题和解析
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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