ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

滴滴出行校招系统开发工程师笔试题型解析与备考策略

滴滴出行校招系统开发工程师笔试题型解析与备考策略 秋招那阵子系统开发工程师的笔试一场接一场滴滴出行2018校园招聘的这次网申笔试算是同类里比较有代表性的。很多人一看“系统开发”四个字就以为只刷算法题结果上了考场才发现逻辑题、专业选择题、编程题、场景设计题全都有时间还特别紧。这篇文章就把这批笔试的考察逻辑、高频考点和临场打法拆开讲清楚适合正在准备互联网公司后端/系统开发岗校招的同学对照参考。先说结论这套笔试卷子没有特别偏的怪题整体难度在“基础扎实就能及格、细节到位才能高分”这个档位真正的区分度集中在编程题和一两道业务场景题上。下面我按自己的理解把整场笔试掰开揉碎了过一遍。1. 先搞懂这场笔试到底在考什么1.1 出题逻辑系统开发工程师要解决什么问题要理解笔试题为什么这样出得先看岗位本身。滴滴出行这类平台型公司系统开发工程师日常工作接触的是交易订单、司机调度、计费结算、消息推送、用户增长这类高并发业务系统。和纯算法岗不同系统开发更看重工程落地能力代码能不能跑、接口能不能扛住流量、出了问题能不能快速定位。所以笔试筛选的不是“竞赛型天才”而是计算机基础面广、代码功底扎实、对业务场景有基本敏感度的候选人。基础题量大但是直来直去考的是熟练度场景题不要求你写出完整方案但要求你能说出关键选型和理由。提示准备这类笔试别光盯着LeetCode刷题计算机基础课程里的操作系统、网络、数据库同样不能丢专业单选题里到处是它们的影子。1.2 参考题型分布与时间分配校招在线笔试的题型和分值每年会有浮动但整体框架是稳的。以下是我根据近几年互联网公司校招的常见安排整理的一份参考分布滴滴这批笔试也基本在这个范围内环节参考题量建议时长考察重点行测/逻辑推理15-20道25-30分钟快速读题、逻辑判断、数字推理专业单选题25-35道35-45分钟数据结构、操作系统、网络、数据库、语言基础编程题2-3道40-50分钟算法设计、编码规范、边界处理主观/场景设计题1-2道15-20分钟业务理解、系统设计思维这个时间分配背后有个逻辑行测题放在最前面一方面考察逻辑思维另一方面其实是在考察你在压力下的取舍能力——一道题卡住了会不会果断跳过。专业单选题是拿分基本盘技术面挂在选择题上最亏。编程题是区分度所在写得完不代表能拿满分时间复杂度、空间复杂度、边界情况都会影响评分。场景题则是在测“你有没有工程师视角”答案开放踩点得分。1.3 为什么试卷要这样组合在线笔试是海选环节一天要筛几千份卷子纯主观题没法大规模批改所以必须靠客观题完成第一轮过滤。但客观题只能测“知道什么”测不出“能不能做”所以必须搭配编程题和少量主观题。这个组合的本质是先用机器能判的题目快速划线再用代码题验证动手能力最后用场景题看看候选人有没有业务sense。想明白这一层你在考场上就不会慌。遇到不会的选择题蒙一个走人别耽误后面编程题的时间编程题卡住了按部分通过的思路写能拿多少算多少场景题哪怕没系统学过设计也可以从自身使用产品的体验出发把想到的技术点列出来。2. 核心考点深度拆解每个模块怎么准备2.1 数据结构与算法高频出题点与应对思路算法题在各家笔试里基本都是重头戏滴滴这批也不例外。从考试后的反馈来看出题风格偏向“中等难度、贴近业务、考察基本功”不会刻意出极难的竞赛题但也不至于让你白送分。高频数据结构我整理过这么几类线性表数组和链表的操作比如判断链表是否有环、找链表倒数第K个节点、合并两个有序链表。这类题目考的是指针操作和边界处理看似简单但很容易栽在空指针和边界判断上。栈和队列重点题型包括用两个栈实现队列、单调栈求最大矩形、滑动窗口最大值等。优先队列堆经常会用来解决TopK问题这在订单金额统计、司机评分排序等场景非常常见。哈希表两数之和、字母异位词分组、LRU缓存设计。哈希表的价值在于把查找从O(n)降到O(1)笔试中凡是涉及“快速查找是否存在”的题目优先想想这个方向。二叉树层序遍历、最近公共祖先、二叉搜索树的插入删除。二叉树题目套路性强递归解法写起来很顺手但要特别注意递归的终止条件。图拓扑排序、最短路径、连通性判断。图的题目通常不会单独考而是挂在一个业务场景下出现。算法方面笔试常考的不外乎二分查找及其变种、排序算法快排、归并、堆排序、双指针、动态规划基础题背包、最长递增子序列、贪心。这里有个很重要的建议做题别光追求AC写完题目回头看一眼时间空间复杂度。面试官在笔试阅卷时除了看结果对没对还会看代码写得规不规范、有没有多余的遍历、有没有刻意用O(nlogn)回避O(n)的方案。我经常跟学弟学妹说如果你在过了样例之后还能在自己的代码旁边写上复杂度分析哪怕题目没全对印象分也会好很多。2.2 操作系统与计算机网络基础题的大本营专业单选题里操作系统和计算机网络至少占三分之一而且很多是“看似会、其实容易错”的经典题。操作系统这部分重点在四个方向进程与线程区别、通信方式管道、消息队列、共享内存、信号量、线程同步互斥互斥锁、读写锁、条件变量、死锁四个必要条件与预防。内存管理虚拟内存、分页分段、页面置换算法LRU、FIFO、Clock、内存碎片。调度算法进程调度先来先服务、短作业优先、时间片轮转、多级反馈队列磁盘调度电梯算法等。文件系统与I/O阻塞与非阻塞、同步与异步这一块在编程题里看不出差别但选择题爱出而且面试也爱追问。网络这边的重点其实非常集中TCP三次握手四次挥手的状态变化、为什么不能两次握手、TIME_WAIT的作用、TCP如何实现可靠传输滑动窗口、拥塞控制。TCP vs UDP各自的适用场景以及基于UDP的上层协议比如QUIC这类常被拿来问新兴协议。HTTP状态码含义尤其301/302/403/404/502/503、GET和POST的区别、HTTPS的握手过程与证书验证。DNS与CDN域名解析过程、缓存层级这类题偶尔出现在选择题或主观题里用来考“用户访问一个网页发生了什么”。我见过不少同学复习时只刷算法题结果专业单选题一上来连“TCP建立连接需要几次握手”都要犹豫这其实很亏。系统开发工程师每天都在跟网络打交道这些基础概念直接决定了你遇到线上问题时有没有排查思路。注意网络题里最容易翻车的是“状态码含义”和“TCP挥手状态机”考前建议把经典的TCP状态迁移图画一遍把常见的4xx、5xx状态码连同产生原因都过一遍比死记题海有效得多。2.3 数据库与缓存从原理到场景都要会数据库的选择题和场景题几乎不会缺席。系统开发岗位不要求你是个DBA但建表要给索引慢查询要能定位这是基本功。数据库的高频考点有这些索引B树为什么适合做索引、聚簇索引与非聚簇索引的区别、最左前缀原则、覆盖索引、索引失效的场景对索引列使用函数、隐式类型转换、like前置通配符等。事务ACID四个特性、隔离级别读未提交、读已提交、可重复读、串行化、MVCC的基本原理以及不同隔离级别下可能出现的脏读、不可重复读、幻读。锁表锁、行锁、间隙锁死锁的检测和处理。SQL编写分组统计、联表查询、子查询这类题有时候不考选择题直接让你手写SQL。缓存方面Redis是绝对的主角。常考的就是Redis支持哪些数据结构、各自适合什么场景缓存穿透、缓存击穿、缓存雪崩分别是什么、怎么解决Redis持久化机制的区别以及分布式锁怎么用Redis实现。场景题部分我对滴滴这类业务印象比较深的一道变形题是这样的一个订单表每天新增千万级数据查询订单时按用户ID和时间段筛怎么设计索引和存储这类题考的就是最左前缀和分库分表的理解。你先按“用户ID下单时间”建联合索引这是最直接的答案再往下可以谈数据量大了以后按用户ID分表把最近的订单放热表历史订单归档到冷表。能把冷热分离和索引设计讲清楚基本就能拿到大部分踩分点。2.4 编程语言准备Java和C的备考重点系统开发工程师笔试一般允许自选语言Java和C是主流也有部分岗位用Python收代码题。语言本身不是考点但语言特性和底层机制是选择题的重要来源。如果你用Java下面是几个重点集合框架HashMap的底层结构、扩容时机、为什么线程不安全ConcurrentHashMap的实现演进分段锁到CASArrayList与LinkedList的区别与适用场景。JVM基础内存区域划分、对象的创建与回收、常见垃圾回收器、类加载机制。并发编程synchronized与ReentrantLock的区别、volatile的可见性、ThreadLocal的原理与内存泄漏问题、线程池的核心参数与拒绝策略。如果你用C重点就要放在内存管理栈与堆的区别、智能指针unique_ptr/shared_ptr/weak_ptr的实现原理与循环引用问题。语言特性虚函数与多态的实现机制、构造函数和析构函数的调用顺序、左值右值与移动语义。STLvector扩容机制、map与unordered_map的实现与适用场景、迭代器失效问题。编程题部分有个高频手写题清单建议考前在本地编译器里至少完整写一遍单例模式懒汉/饿汉/双检锁、生产者消费者模型用锁和条件变量、死锁的代码示例、实现一个固定容量的LRU缓存。这些题目都不长但能同时检验你的编码习惯和并发理解笔试编程题和面试手撕代码都有可能在它们的基础上变形。3. 结合出行场景的高频“业务题”与答题思路3.1 如何快速匹配订单从空间索引到排序优化滴滴这类出行平台笔试和面试里最典型的一道业务题就是乘客下单时如何找到附近的司机并完成派单这道题看似开放式但背后考的是空间检索和 TopK 的思路。最直观的方案是拿到乘客坐标后遍历当前所有空闲司机的坐标用经纬度距离公式算出距离然后排序选最近的。这个方案在司机数量少的时候完全可行但城市级场景下在线司机可能是十万甚至百万量级每次派单都全量遍历性能完全撑不住。常见的优化方向有三个GeoHash编码把二维经纬度降维成一维字符串根据公共前缀长度判断距离的近似程度然后按前缀做索引。优点是实现简单、能配合数据库查询缺点是边界处可能出现两个很近的点编码前缀完全不同的情况通常需要配合周围八个格子一起查来解决。四叉树/网格索引把城市地图切成多级网格司机上线时注册到所在网格乘客下单时先找所在网格及邻接网格再逐层扩大范围直到找到足够多的候选司机。KD树维护司机坐标的KD树支持K近邻查询在点集动态变化时需要处理树的更新成本。答这道题时我建议别只抛名词要说清楚取舍。比如你可以这么答候选司机量级不大的时候直接内存中算距离最小堆选TopK量级大了以后用GeoHash做粗筛在召回集合里再精确计算距离并用多级降级策略保证系统在极端高峰流量下还有兜底逻辑。这样答出来说明你不仅知道一种做法还知道在什么场景下用什么做法。3.2 最短路径与导航Dijkstra和A*都要能讲明白地图导航和出行平台是天然绑定的所以和图论算法相关的题也会出现。常见考法有给一个地图抽象出的带权图求两端点之间的最短路径或者在网格地图里找一条从起点到终点的路径。Dijkstra是标准答案但面试官通常会继续追问地图规模很大的时候怎么办这时候要提A搜索。A和Dijkstra的区别在于引入了启发式函数常见的选择是用到终点的欧氏距离或曼哈顿距离作为估计值在方向性强的搜索场景里能显著减少扩展节点数。如果你在编程题里抽到这类题有几处细节容易丢分图的存储方式用邻接表而不是邻接矩阵否则空间复杂度会很高。优先队列的实现堆里存放的是“当前距离估计距离”节点可能被重复入堆需要判断是否已经处理过。边界情况起点终点相同、图中存在负权边如果有说明Dijkstra不适用应改用SPFA或Bellman-Ford。答题时如果能主动提到“真实地图引擎会用层级路网REST接口不会把所有路径计算都压到业务服务上”会让面试官觉得你有工程视角而不只是会背算法。3.3 设计一个打车订单系统主观题的答题框架我看到有些同学一碰到“设计一个订单系统”这种开放题就懵因为它没有一个标准答案。但其实阅卷人看得不是你的方案有多全而是你有没有一套稳定的分析框架。我自己常用的框架是四段式功能拆分、存储设计、核心流程、瓶颈与应对。功能拆分这一步先说清楚订单系统要支持什么创建订单、查找订单、司机接单、订单状态流转、订单取消、订单查询列表。存储设计这块订单表的核心字段要有订单ID、乘客ID、司机ID、出发地经纬度、目的地经纬度、预估价格、状态、创建时间等热点查询按乘客查列表所以考虑“乘客ID创建时间”联合索引核心流程要挑一个讲透比如创建订单时如何写库、如何派单、如何通过消息队列通知司机端App瓶颈与应对就重点讲高并发削峰、订单状态幂等、历史订单冷热分离。这套框架我用过很多次效果是至少能把思路铺开写到每一个部分都能踩到专业词汇比如幂等、消息队列、分库分表、缓存。主观题哪怕只有15分钟也够你写出一版有结构的答案了。4. 实操过程完整对比一场笔试的关键节点与做法4.1 开考前准备环境检查千万别省在线笔试的战场不在纸上而在浏览器里。我见过太多人因为环境问题翻车电脑弹窗提醒打断了编程状态、IDE自动补全校验不过、网络突然断开导致代码没提交上。开考前至少做好三件事找一台性能稳定、电量充足的电脑提前测试摄像头和麦克风很多在线笔试系统有防作弊监考要求。提前登录笔试平台进入模拟练习页面确认代码编辑器支持的语言和你本地环境的版本一致尤其是Java版本和C编译器标准。准备好草稿纸、笔、身份证件关掉所有无关的聊天软件和弹窗提醒把浏览器升级到指定版本。这一套流程大概花20分钟但能帮你规避掉至少一类非技术风险。别嫌麻烦现场出问题的时候心态会崩直接影响后面的答题节奏。4.2 答题顺序策略先保分再攻坚整场笔试的时间是紧的我的建议顺序是先做专业单选题再做编程题最后处理主观题。行测逻辑题放到专业题之后、编程题之间做也可以但原则是一样的——不要在一道题上死磕超过2分钟。选择题部分目标是快速拿稳确定的分数。一道题如果30秒内没有明确思路先标记跳过整份卷子做完一轮之后再回来看这样做的好处是避免了因纠结一题导致后面编程题时间不够。编程题部分建议按难度从低到高做。拿到题目先别急着写花3-5分钟读清楚输入输出格式想好数据结构和算法再动手。很多编程题不是不会做而是样例输入的理解出了偏差导致白白浪费提交次数。更聪明的做法是在草稿纸上先写几个边界测试用例比如空数组、只有一个元素、最大数据量写代码的时候把这些边界都覆盖到。主观题部分建议放在专业题和编程题之后。因为主观题的采分点比较松散先写个完整框架就能拿一部分分而编程题和选择题才是区分度最集中的地方值得优先投入时间。4.3 编程题手把手演示从读题到AC的完整流程拿一道典型的笔试编程题来演示我的答题节奏。假设题目是输入N个订单的价格求金额最大的K个订单按降序输出。N最大为100万K不超过100.先分析100万量级全排序的时间复杂度是O(NlogN)在笔试环境下勉强能过但不是最优解。题目只要求最大的K个用大小为K的最小堆来做遍历一遍数组堆顶始终是当前K个最大值里的最小值新元素大于堆顶时替换并调整堆最终堆里就是答案时间复杂度降为O(NlogK)。下面给出Java示例用PriorityQueue实现import java.util.*; public class Main { public static void main(String[] args) { Scanner sc new Scanner(System.in); int n sc.nextInt(); int k sc.nextInt(); PriorityQueueInteger minHeap new PriorityQueue(k); for (int i 0; i n; i) { int price sc.nextInt(); if (minHeap.size() k) { minHeap.offer(price); } else if (price minHeap.peek()) { minHeap.poll(); minHeap.offer(price); } } ListInteger result new ArrayList(minHeap); result.sort(Collections.reverseOrder()); for (int price : result) { System.out.println(price); } } }这段代码有几个容易踩的细节第一PriorityQueue默认是小顶堆所以直接拿来当最小堆用没问题第二如果K等于0上面的代码会空指针所以一定要在开头加判断第三输出要求降序堆里并不是降序排列的所以要单独排序再输出。写完之后我会在本地跑几组测试样例包括K大于N的极端情况、所有价格都相同、K等于1、N等于100万的随机大数组。确认无误后再提交。多验证这一步能少交很多次无效提交。4.4 主观题答题模板用结构化方式争取踩分点主观题往往没有标准答案但阅卷人手里有采分点。你写得越结构化越容易让阅卷人快速看到你的得分点。我常用的一段式模板是先一句话定义问题范围再分点答存储结构、核心流程、异常处理、性能优化。比如题目是“请设计一个订单号生成方案”。可以这样答订单号需要全局唯一且要尽可能短、可读性高、支持高并发生成。方案一数据库自增ID加分库分表后的分表因子组合缺点是并发量高时数据库可能成为瓶颈。方案二用Redis的INCR命令生成自增序列再拼接日期和分片标识优点是简单高效缺点是依赖Redis可用性。方案三采用Snowflake雪花算法用时间戳机器ID序列号组成64位整数单机每秒可生成百万级别ID且趋势递增适合订单系统。如果考虑到时钟回拨问题可以预留一段序列号空间或记录上次生成时间戳发现回拨时等待对齐。这样一段回答既有方案对比又有选型理由还主动提到了异常情况比只抛个“雪花算法”要完整得多。5. 常见失分点与备考避坑清单5.1 高频失分点整理我复盘过不少校招笔试的反馈失分点高度集中在下面几类失分表现根本原因应对办法选择题把“错误的是”看成“正确的是”审题不细致题干关键词先圈出来尤其注意否定词编程题只过了样例没处理边界测试用例覆盖不全提交前先跑空、溢出、最大量级等边界用例专业题花时间太多编程题没时间写答题顺序不对按“选择题→编程题→主观题”的顺序推进场景题只会堆名词没有方案对比缺乏系统设计思考框架用四段式框架组织答案讲选型和理由代码编译不通过环境配置问题考前没做环境测试提前登录笔试平台跑通一套完整流程还有一个非常隐蔽的失分点在线笔试系统可能会对长代码的编译时间敏感。如果你写了一个超大规模的循环或者递归过深导致栈溢出即使逻辑正确也可能在评测时超时或崩溃。这类问题要靠平时养成良好的复杂度意识来避免别只盯着“能跑出结果”。5.2 一个月备考计划参考如果离笔试还有一个月时间怎么分配我给的参考计划是这样的第1周扎实过一遍核心基础课。操作系统、计算机网络、数据库各花两天过一遍高频考点用思维导图做总结把专业单选题的丢分率压到最低。第2周集中刷算法题。按数据结构分组刷题每天保证3-5道重点攻克链表、二叉树、动态规划、堆、哈希表。每道题不光写代码还要分析复杂度尝试用不同方法解同一道题。第3周查漏补缺和编程题模拟。这个阶段做一些完整在线笔试试卷严格按考试时间限时完成模拟真实紧张感。做完后重点复盘错题把模糊知识点重新翻书弄懂。第4周冲刺复习和实战演练。回归基础概念把之前的笔记和错题过一遍重点是不要留下知识盲区。如果有余力再看一些系统设计题的基础思路。这套计划的逻辑是先解决选择题的基本盘再用算法题拉开差距最后用模拟考稳定状态。5.3 考后复盘比考试成绩更重要笔试结束不等于这件事就过去了。我见过不少进面试的同学被问起“笔试里有一道题你是怎么做出来”时答不上来。所以考完当天趁记忆还新鲜把每道题目的解题思路和自己的答案写下来尤其是那些做得不完美的题重新做一遍。这些复盘内容不只是用来准备面试也是在帮你发现自己知识体系里的薄弱环节。很多技术栈是关联的比如一道关于订单系统的设计题可能同时涉及数据库索引、缓存、消息队列、分布式ID任何一个环节模糊都应该回到对应的知识点做一次系统学习。把每次笔试当成一次免费的模拟面试是校招路上成本最低、回报最高的练习方式。6. 最后说一点个人经验今年秋招季陆续有学弟学妹找我聊笔试我发现一个很有意思的现象很多人刷了两个月的算法题却很少翻操作系统和数据库的教材觉得那些是面试前“临时抱佛脚”的东西。但实际做下来专业单选题才是笔试分数的基础盘算法题决定你能不能考高分而基础题决定你过不过线。准备系统开发工程师笔试我的体会是千万别有“赌题”心态。你今天在题海战术里刷到的一道题明天不一定考但为了刷题而建立起来的知识网络是确定性的价值。把地基打牢把每个模块的知识点串成体系比什么都重要。另外笔试不是一个人的战斗。你可以找三五个同学组一个备考小组定期抽题互相讲讲不出来就说明没真正掌握。这个办法比一个人埋头刷题高效得多。祝你笔试顺利拿到心仪的offer。
返回列表