十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

滴滴算法岗笔试实战指南:从KMP到动态规划的高频考点与备考策略

滴滴算法岗笔试实战指南:从KMP到动态规划的高频考点与备考策略 1. 笔试考察逻辑与考点布局1.1 算法岗笔试到底在筛什么样的人每年秋招的算法岗笔试本质上是一场大规模的信号筛选——简历已经筛过一轮笔试要做的不是招到全对的人而是用最少的时间成本把代码能力不过关、基础概念不扎实、临场心态容易崩的候选人过滤掉。滴滴的算法岗笔试题型结构上和其他大厂大同小异但细节出得很讲究踩过的坑也不少。先说结论笔试的淘汰率通常高于面试一套卷子下来能过线的往往不是全部AC的人而是该拿的分都拿到的人。为什么因为笔试题目设计出来就默认了绝大多数人做不完。我当年第一次参加这类笔试时以为像LeetCode周赛一样全做完才算稳结果四道编程题两道hard级别直接卡死在第二题后面两道根本没有时间看。后来才明白笔试考察的核心能力有三层第一层是能不能看懂题第二层是能不能在限定时间内写出可运行的代码第三层是能不能在高压下保持思路清晰把会做的题稳拿分。考察范围基本覆盖三块按重要性排序如下数据结构与算法基础数组、链表、栈、队列、哈希表、二叉树、堆、图论、排序、二分、双指针、滑动窗口、动态规划、贪心、回溯、KMP、Dijkstra等。机器学习与深度学习基础常见损失函数、过拟合与正则化、偏差方差分解、朴素贝叶斯、逻辑回归、SVM、决策树、随机森林、GBDT/XGBoost、K-Means、PCA、CNN/RNN/Transformer的基础原理以及各类算法的最优化方法。工程与场景应用题特征工程、样本不均衡、评估指标选择、推荐/风控/供需预测等业务场景里的算法方案设计。更准确地说这3类内容在笔试题型里的呈现方式并不相同。数据结构和算法主要以编程题的形式出现机器学习基础以选择题和简答题为主场景题则会以开放型问答或方案设计题出现。接下来我把这几个部分逐一拆开讲结合我自己参加2024年秋招滴滴算法岗笔试的体验和复盘聊聊具体怎么准备。1.2 选择题与编程题的权重分配滴滴的算法岗笔试通常给的时间是90到120分钟题量大概在20道选择题加3到4道编程题。选择题一部分考机器学习基础另一部分考计算机基础操作系统、网络、数据库偶尔也会沾边编程题则是纯算法题。我的体会是选择题要的是稳编程题求的是准。选择题做错一道可能只扣三四分但编程题全挂基本宣告出局。所以在时间分配上我的策略是选择题每道控制在2分钟以内不会的标记一下赶紧跳过把大块时间留给编程题。顺带提一个很多人忽略的点部分笔试平台支持本地IDE调试但也有一些平台只能在线编辑不能跑测试用例。这个细节最好提前搞清楚否则会非常影响节奏。我在实际笔试时遇到过只能在线写代码、不能调试的平台说真的那种情况下对代码基本功的考验会放大很多倍。针对选择题常见的考察方向包括过拟合的解决方法正则化、数据增强、Dropout、早停等偏差和方差的含义及二者之间的权衡各类损失函数的适用场景交叉熵、均方误差、Hinge Loss等梯度消失和梯度爆炸的原因与应对卷积神经网络中感受野的计算L1与L2正则化的区别、为什么L1能产生稀疏解常见聚类算法的优缺点K-Means、DBSCAN、层次聚类常见排序算法的复杂度及稳定性这些东西看着多其实都是基础题难度不高但范围很广需要系统过一遍。编程题方面依我观察滴滴的算法笔试风格偏业务落地型不像纯竞赛题那样偏门但场景包装很足。比如第一道题可能是一个数组处理的小题第二道可能就是个带情景的图论或动态规划题第三四道难度会明显抬高。题目的考察点集中在二分搜索、双指针、滑动窗口、拓扑排序、最短路变体、区间DP和状态压缩DP。这些都是面试高频考点也是可以在短时间内通过系统刷题提升的部分。注意笔试不是竞赛不需要追求全AC但至少要保证第一道题快速AC第二道题尽量AC后面的大题就算拿部分分也能进面。这个策略能帮你在心态上稳很多。2. 核心编程题拆解与实战思路2.1 字符串算法KMP这类题的套路热搜词里反复出现KMP、字符串匹配、next数组相关的考点这类题在笔试里虽然不会直接让你默写KMP但常在字符串处理或敏感词过滤等场景中用到。所谓next数组核心思路是当模式串与目标串在某一位失配时不用从头再匹配而是利用已经匹配的前后缀信息跳到下一个可能的位置。以模式串pabacaba为例它对应的next数组按通常的定义next[i]表示p[0:i]子串的最长相等真前后缀长度且不包含自身计算过程如下位置i子串最长相等真前后缀next[i]0a无01ab无02abaa13abac无04abacaa15abacabab26abacabaaba3这里有一个很实用的经验笔试时不推荐现场推导next数组的完整数学证明但要熟练掌握递推代码。def build_next(p): m len(p) nxt [0] * m j 0 for i in range(1, m): while j 0 and p[i] ! p[j]: j nxt[j - 1] if p[i] p[j]: j 1 nxt[i] j return nxt笔试里遇到字符串匹配题如果目标串长度很长、模式串很短优先考虑KMP别用暴力法。虽然暴力法在大多数用例下也能跑通但在大量重复字符的场景下会退化成O(n*m)超时风险极高。另外字符串算法里还有一类高频变体最长公共前缀、字典序相关、字符串哈希。特别是字符串哈希用滚动哈希可以在O(n)时间内完成很多匹配问题笔试时思路简单又不容易错值得熟练掌握。2.2 贪心与动态规划如何快速判断题型动态规划是算法岗笔试的大头基本每套卷子必出。难点不在于代码本身而在于短时间内判断这道题该用DP还是贪心还是其他方法。区分贪心和DP的一个实用标准如果每一步的最优选择只依赖于当前状态且选择之后不会影响未来状态那大概率是贪心如果选择会影响后续的收益需要记录所有可能的状态那就是DP。举例来说区间调度问题是标准贪心——按结束时间排序依次选择即可但如果是带权区间调度每个区间有不同的收益贪心就会失效这时需要按结束时间排序后动态规划求解。DP的解题框架我习惯按这四步走定义状态明确dp[i]表示什么这里最好对应一个具体含义避免模糊。找到转移方程思考dp[i]可以从哪些前面的状态转移过来。初始化手动算清边界值。确定遍历顺序搞清楚是从左到右、从右到左还是二维循环。以最长递增子序列为例def length_of_lis(nums): n len(nums) dp [1] * n for i in range(n): for j in range(i): if nums[j] nums[i]: dp[i] max(dp[i], dp[j] 1) return max(dp)笔试时如果发现O(n²)会超时可以考虑用贪心加二分维护一个递增序列数组时间复杂度降到O(n log n)。这个优化在数据范围大的题目里往往是过不过的关键。区间DP在滴滴的笔试里也出现过考点很经典石子合并、括号匹配、回文串分割。这类题的核心在于先枚举区间长度再枚举左端点计算右端点最后枚举分割点。代码模板相对固定熟练之后反而比普通DP更容易得分。状态压缩DP是另一个常见的难点。看题目数据范围如果n在20以内基本可以锁定状态压缩思路。比如经典的Hamilton路径问题用dp[mask][i]表示已访问集合为mask、最后停留在i的最短路径转移时枚举下一步要去的节点。这类题在笔试中出现的频率不如基础DP高但一旦出现就是拉开差距的题。2.3 图论与搜索Dijkstra高频变体图论算法里最常考的不是那些复杂的网络流而是Dijkstra、拓扑排序、并查集和二分图判断。滴滴的业务里涉及路径规划、供需匹配所以图论题的出现频率不低。Dijkstra是我建议必须做到熟练默写的算法。笔试时的考法一般不会直接给你一张图让你求最短路径而是套一个业务场景比如地图上有若干个打车点每个点有等待时间求从起点到终点的最短时间核心还是最短路但建图方式可能有所变化。import heapq def dijkstra(graph, start, n): dist [float(inf)] * n dist[start] 0 pq [(0, start)] while pq: d, u heapq.heappop(pq) if d dist[u]: continue for v, w in graph[u]: if dist[u] w dist[v]: dist[v] dist[u] w heapq.heappush(pq, (dist[v], v)) return dist经验提醒Dijkstra的堆优化写法一定要熟练因为笔试时Python跑稠密图使用朴素O(n²)实现会超时而堆优化时间复杂度是O((VE)logV)大部分场景都能过。拓扑排序也是个高频考点典型场景是有依赖关系的任务调度或课程安排。这类题常常用入度表和队列实现判断是否存在拓扑序顺便检测图中是否有环。并查集的考法更隐蔽经常包装成判断两个节点是否连通或划分朋友圈等场景但模板很固定提前准备好代码笔试时能快速写出来。搜索算法里BFS适合求最短步数DFS适合方案枚举和回溯。笔试中BFS出现频率高于DFS因为很多题目明确问最少需要多少步。另外剪枝在DFS里非常重要尤其是数据规模比较大时不剪枝就是指数级爆炸。注意图论题在笔试里最容易出小数据范围陷阱——题目看起来数据范围很小用DFS暴力就能跑但如果没注意是多个测试用例暴力会直接TLE。3. 机器学习与深度学习考点梳理3.1 基础理论题过拟合、损失函数、优化器机器学习基础在笔试选择题里占的比重非常高。一个常见的出题套路是给一个模型训练的情景让你判断当前模型处于高偏差还是高方差状态应该增加数据还是增加模型复杂度。这类题目的关键是对偏差-方差分解的理解。高偏差的表现是训练集和验证集误差都很高可以理解为模型学不动高方差的表现是训练集误差低但验证集误差高可以理解为模型记性太好、泛化不足。前者对应欠拟合应对策略是增加模型复杂度、减少正则化、增加特征后者对应过拟合应对策略是增加训练数据、增加正则化、Dropout、早停、数据增强。损失函数的知识点也常考尤其是交叉熵和均方误差的区别。分类问题用交叉熵回归问题用均方误差这是基础。更细一点会考到为什么分类问题不用MSE因为MSE对梯度下降不友好sigmoid加MSE容易导致梯度消失而softmax加交叉熵的梯度形式更简洁、收敛更快。优化器方面SGD、Momentum、RMSProp、Adam的区别是高频考点。笔试不会让你手推每一个公式但会考你对核心思想的理解SGD收敛慢且容易震荡Momentum通过累积历史梯度来加速RMSProp对每个参数自适应调整学习率Adam是Momentum和RMSProp的结合。我建议把L1与L2正则化也复习扎实。L1正则化能得到稀疏权重原因是在0点处不可导优化时更容易让权重变成0L2正则化让权重整体变小但不会变成0。选择题喜欢考哪个正则化能用于特征选择答案是L1。3.2 手推公式与计算题从LR到朴素贝叶斯笔试里还可能出现一些需要手算或简单推导的题。最常见的是逻辑回归的梯度下降推导、朴素贝叶斯的后验概率计算、决策树的信息增益计算。以朴素贝叶斯为例题目通常会给你一组训练数据让你预测某个新样本的类别。解题思路是分别计算各类别的先验概率和每个特征的条件概率然后套贝叶斯公式比较后验大小。这类题只要细心基本不会错需要注意的是平滑处理比如拉普拉斯平滑。逻辑回归的推导题一般是写出损失函数、求梯度、给出更新公式。标准流程是预测函数为h(x) sigmoid(w^T x)损失函数为交叉熵对w求偏导后得到梯度为(h(x)-y) * x更新公式是w w - learning_rate * gradient。这一套用熟之后笔试时基本是送分题。决策树部分会考信息增益和基尼系数的计算。信息增益的计算逻辑是划分前的熵减去划分后各子节点的加权熵基尼系数类似。这一类题建议找几道经典例题练手把计算流程走一遍考试时就不会慌。3.3 场景题推荐、风控、供需预测怎么答滴滴的业务场景给算法岗笔试增加了一些方案设计题常见问法包括如何预测未来某个区域的订单量如何设计一个司乘匹配策略如何识别异常订单这类题目没有标准答案但阅卷时会看你的思路是否完整、方法是否合理。我的答题框架通常包括四步明确问题搞清楚是分类还是回归线上还是离线核心指标是什么。数据与特征列举可能用到的数据源如历史订单、天气、时间、位置、用户画像然后提出特征工程方案包括时间特征、空间特征、统计特征。模型选型根据数据规模和实时性要求选择合适模型并说明理由如GBDT适合表格数据深度学习适合高维稀疏特征。评估与迭代怎么设计离线评估和在线AB实验如何根据反馈迭代。答题时切忌只写用深度学习要把每个环节说清楚展示出你真正做过类似项目的思路。4. 备考策略与易错点排查4.1 时间规划不同基础的人怎么安排笔试备考的周期因人而异但我的建议是不管基础如何都留出至少4到6周的系统准备时间。基础较薄弱的同学前两周重点补数据结构基础数组、链表、栈、队列、哈希表、树、图把每种结构的常见操作过一遍。中间两周刷题按题型分类刷从数组/字符串到二分/双指针再到DP和图论。最后两周做整套真题模拟严格按照笔试时间限时训练培养时间分配和心态控制能力。基础较好的同学可以直接进入刷题加模拟阶段但要注意不要只刷自己擅长的题。我的经验是每周固定抽一到两天专项突破弱项尤其是DP和图论这类题不练手是真的会生疏。这里推荐一个具体的刷题节奏按每天2到3小时计算第1周数组、链表、栈、队列、哈希表约60道题第2周二分、双指针、滑动窗口、字符串约50道题第3周二叉树、DFS、BFS、回溯约50道题第4周动态规划背包、区间、状态压缩约50道题第5周图论、贪心、并查集、拓扑排序约40道题第6周全真模拟加错题回顾4.2 刷题效率与代码习惯刷题不是求数量而是求熟练度和思维训练。我见过不少人刷了300道题依然笔试翻车核心问题是看题会写题废。建议每道题都自己动手写完整代码并在本地跑几个测试用例不要只在大脑里过一遍思路就跳到下一题。代码规范化也很重要尤其是在笔试平台不能调试的情况下。平时写代码就要养成好习惯变量命名清晰函数边界正确处理循环条件仔细推敲空数组和边界值都测一遍。笔试现场我还有一些独家小技巧拿到题目先看数据范围反向推断期望的时间复杂度比如n10^5基本是O(n)或O(n log n)不太可能是O(n²)。先写一个能正确跑通的暴力解法保底再考虑优化。这一招在压轴题特别有用部分分也能拿不少。做题顺序不要按题目顺序来先扫一遍所有题目把最有把握的题先拿下再啃硬骨头。如果某道题卡了20分钟还没有思路先跳过做后面的回头的可能性和正确率往往更高。4.3 笔试环境与常见坑笔试环境这块我踩过不少坑分享出来希望大家避开。第一网络和设备。笔试前一到两天务必确认电脑摄像头、麦克风、浏览器兼容性是否正常。很多笔试平台需要摄像头监控而且只支持Chrome或指定浏览器提前调试好可以有效避免临场换电脑的惨剧。第二时间分配。有些平台会显示每题倒计时有些不会。如果遇到不会显示时间的平台自己一定要在草稿纸上记下开始时间每隔一段时间看一眼进度避免出现感觉才过半小时实际已经过去一小时的误判。第三编程题的输入输出。笔试平台的输入输出格式各不相同有的要求多组输入有的是一组有的还带特殊字符。每次做题前先看清示例格式不要想当然。我最惨痛的一次经历是题目要求输出保留两位小数但我直接输出了原始浮点数丢掉了一整道题的分数。第四截图或切屏问题。不少平台会监测切屏行为频繁切屏可能被判作弊。平时做题就要养成不看资料的习惯考试时更不能有事没事切出去看看时间。5. 关于笔试的一些个人体会从我的经历来看算法岗笔试真正考的不是智商而是熟练度和抗压能力。一个题型你练过十遍考场上哪怕变形也能快速认出套路一个题型你只见过一次考场上基本就是白给。所以备考核心就一句话把高频考点练到形成肌肉记忆。最后分享一个实用心得每次笔试结束后马上把不会的题复盘一遍记录题型、卡点、正确解法建立一个自己的错题本。这个错题本在后续其他公司的笔试中价值巨大因为大厂的出题风格虽然有差异但底层考点高度重合。我在秋招期间建立的错题本大概整理了80来道题后面的笔试明显越做越顺。如果时间允许建议提前了解一下滴滴的业务方向比如出行供需预测、路径规划、司乘匹配、安全风控等这些在场景题中经常会用到。有业务背景的回答比纯粹套模型的回答更能体现你的工程思维。说到底笔试只是一道关卡过了当然好没过也别太当成否定。我身边有不少人笔试成绩一般但面试表现好也拿到了好结果。准备笔试的过程本身就是把算法基础打扎实的过程这个沉淀无论最后去哪里都值了。
返回列表