滴滴出行2017秋招算法岗笔试的真题汇总在各类面经平台和论坛里被翻来覆去讨论了好多年。我接触过不少准备算法岗位校招的同学他们拿到这份材料后通常会问同一个问题都过去这么久了这些题现在还值得刷吗我的回答是值得而且值得当成主线来刷。滴滴那年的算法岗笔试卷几乎把校招算法笔试的核心套路全部覆盖了——代码题、机器学习理论、概率统计、数据结构原理、场景设计题全部都有后面几年不少公司的出题风格明显沿用了类似的框架。这篇文章就拿这份真题做引子把算法岗笔试的考察重点拆开揉碎逐个模块讲清楚该怎么准备、怎么答题、哪些细节最容易丢分。无论你瞄准的是互联网大厂还是出行、电商、金融这类重算法业务的公司这篇内容都能直接作为备考路线图来用。1. 滴滴这套笔试题到底在筛什么样的人1.1 算法岗笔试和开发岗笔试的本质区别很多人第一次接触算法岗笔试题时会下意识地把它当成开发岗笔试题来准备这是最大的误区。开发岗笔试的核心是代码能力、语言特性和工程规范而算法岗笔试的核心是“用算法和模型解决业务问题”的思维。滴滴2017秋招这套题就很典型代码题会考但考察的深度和方向跟纯开发岗完全不一样。举个例子开发岗可能会让你实现一个线程安全的阻塞队列重点在并发控制算法岗更可能给你一个在城市级路网中求最短路径的场景重点在于如何把业务约束转化为算法约束。滴滴的业务是出行调度所以那个时期的算法岗笔试题里路径规划、ETA预测、订单匹配、供需平衡这些场景会以各种变形出现在题目中。放在今天来看这种“业务场景算法建模”的出题思路已经成了行业共识因此这套题的价值不只是回忆更是理解算法岗考察逻辑的标本。我在实际准备这类笔试时最先做的事情不是刷题而是花了一个晚上把算法岗的能力模型拆成了三层第一层是代码基本功要求的是能在限定时间内写出无 bug 的算法实现第二层是算法原理要求的是能推导、能比较、能分析复杂度第三层是数学基础与模型思维要求的是面对一个开放问题时能想到用什么工具去建模。滴滴这套题恰好三层都考了这也是它一直到今天还有参考价值的原因。1.2 从真题反推出来的试卷结构从公开渠道能拼凑出来的滴滴2017秋招算法岗笔试题整体框架大致分四个板块选择题、编程题、简答/推导题、场景设计题。这种结构在当时的互联网公司里算是比较完整的不少公司只考选择题加编程题滴滴把简答推导和场景设计也放进来了说明出题人对算法岗候选人的要求不只是“会写代码”还得“讲得清原理”“建得了模型”。选择题部分主要覆盖数据结构、算法复杂度、概率统计和机器学习基础看上去是送分题实际上坑特别多每年都有不少人在这里栽跟头。编程题通常是两道到三道难度梯度明显第一道偏基础后面会逐渐加大难度涉及动态规划、贪心、图论或者字符串处理的组合。简答推导题是拉分项常考的内容有损失函数推导、正则化理解、贝叶斯公式应用、常见机器学习算法的原理对比。场景设计题则是整张试卷的点睛之笔通常会给一个出行场景让你谈谈算法方案这道题没有标准答案考察的是思路的完整性和业务理解深度。了解试卷结构最大的价值在于时间分配。我当时给自己定的策略是选择题每道不超过三分钟编程题每题留足二十分钟以上简答推导题每题控制在八分钟左右场景设计题留十五分钟以上。按这个比例执行下来虽然做不到每道题都完美但整体完成度很高。建议你在模拟笔试时也专门练一下时间分配不要在一道选择题上纠结太久因小失大。2. 代码题专项从排序到动态规划的高频考点拆解2.1 代码题第一梯队排序、二分、贪心与双指针滴滴这份真题里的编程题并不是那种让人束手无策的竞赛题而是非常“工作导向”的题目——主要考察候选人能否用常见的算法思想解决实际问题。这意味着准备这类题目时并不需要把LeetCode刷到四五百题把最高频的几十类题目做透效果会好得多。先说说排序。排序在算法岗笔试中出现频率极高但不一定直接让你写快排或归并而是会以变形题出现。比如求数组的第K大元素最常见的做法就是利用快速排序的分区思想每次 partition 之后判断基准元素的位置从而把平均复杂度降到 O(n)。类似的求最小K个数、求数组中位数本质上都能用堆或者快排思想解决。我见过不少同学能背出快排代码但拿到这题还是写不出来原因在于他背的是“模板”没有理解 partition 的逻辑本质。二分查找也是出题人的心头好考察频率非常高。不过滴滴的题目会把二分藏在场景里比如在有序数组里找目标值的插入位置、在一个“先升后降”的数组中找峰值。这些题目真要动手写的时候最容易出错的就是边界条件循环条件是 left right 还是 left right区间更新是 mid 1 还是 mid。我的经验是在笔试现场把二分模板默写出来并不丢人丢人的是模板写对了但区间更新写错导致死循环或者漏掉边界。贪心和双指针这对组合也要重点掌握。滴滴这类有业务场景的公司特别喜欢把“双指针”思想藏在实际问题里比如有序数组去重、求满足条件的最短子数组。做法不难难的是意识到“这题该用双指针”。检验办法很简单当题目给的是一个数组或字符串要求找某个子结构的最优解时通常先想想双指针能不能做不能做再上动态规划。2.2 字符串匹配与KMP的next数组一个高频但容易翻车的考点在你给的搜索热词里“在KMP算法中对于模式串 pabacaba其 next 数组是多少”这个考法出现频率很高它几乎是字符串题目里的常青树。很多人觉得KMP太难干脆放弃只背一个BF暴力匹配就去考试了。但在限时笔试里字符串相关题目一旦数据范围到十万级别暴力匹配大概率超时所以KMP还是值得掌握的。理解KMP只需要抓住一个核心当匹配失败时模式串不从头开始而是跳到之前已经匹配好的某个位置继续。这个“跳”的依据就是 next 数组。我给你们一个还算好记的计算方法next[i] 表示模式串 p[0...i] 这个前缀子串中最长的相等前后缀的长度只算真前后缀不算整体。以 pabacaba 为例逐个计算i0字符a没有真前后缀next[0] 0i1前缀ab最长相等前后缀为0next[1] 0i2前缀aba最长相等前后缀是a长度1next[2] 1i3前缀abac最长相等前后缀为0next[3] 0i4前缀abaca最长相等前后缀是a长度1next[4] 1i5前缀abacab最长相等前后缀是ab长度2next[5] 2i6前缀abacaba最长相等前后缀是aba长度3next[6] 3。所以 pabacaba 的 next 数组是 [0, 0, 1, 0, 1, 2, 3]。在笔试里这种题通常是选择题计算过程本身不难但需要在草稿纸上一步一步算。我之前辅导过的学弟学妹不少人栽在“最长相等前后缀”的定义上把整体字符串也算进去了导致结果错一位。记住真前缀不包含最后一个字符真后缀不包含第一个字符。2.3 动态规划题从状态定义到边界条件的完整推导动态规划在滴滴这套真题里属于压轴级别也是区分度最大的一类题。整理历年的面经可以看到滴滴考过的最短编辑距离、最长公共子序列、最大子数组和这类经典题也考过带有业务色彩的路径规划类问题。我做动态规划题时有一套固定的四步流程第一步明确状态定义也就是 dp[i] 或 dp[i][j] 到底代表什么第二步推导状态转移方程这是核心第三步确定初始化和边界条件第四步确定遍历顺序。以最大子数组和为例状态定义是 dp[i] 表示以第 i 个元素结尾的子数组的最大和转移方程是 dp[i] max(nums[i], nums[i-1] nums[i])最终答案取所有 dp[i] 的最大值。看着简单但很多人现场会卡壳。卡壳的原因往往在于没想清楚“以第 i 个元素结尾”这个限制条件导致状态定义模糊转移方程无从下手。动态规划另一种常见形态是二维 DP比如编辑距离。状态定义是 dp[i][j] 表示把字符串 A 的前 i 个字符转换成字符串 B 的前 j 个字符需要的最少操作次数。转移时考虑三种操作插入、删除、替换分别对应 dp[i][j-1]1、dp[i-1][j]1、dp[i-1][j-1]cost其中 cost 在 A[i]B[j] 时为0否则为1。初始化时要注意 dp[0][j]j、dp[i][0]i这个边界条件代表的是其中一个字符串为空时只能靠插入操作。这类题目在现场容易手忙脚乱我建议把常见二维 DP 的模板整理成自己的笔记考试前翻一遍。还有个容易忽略的点空间优化。很多二维 DP 可以压缩成一维滚动数组笔试时如果不要求输出具体操作序列空间复杂度从 O(n*m) 降到 O(m) 是一个加分项。但同样滚动数组容易写错尤其在遍历顺序需要从后往前更新时。我的建议是先写出最朴素的二维版本确保正确性如果时间充裕再优化空间在笔试环境下正确优先。3. 机器学习与深度学习理论这类题目怎么答才不丢分3.1 必考机器学习知识点损失函数、正则化与过拟合机器学习理论在滴滴这套笔试题里占比不小而且偏向于考查“理解深度”而不是“名词背诵”。比如题目会让你比较 L1 正则化和 L2 正则化的区别表面上是问定义但更想看到你能不能从梯度更新、稀疏性、特征选择、几何意义这几个角度展开。L1 和 L2 的区别我在面试别人时最喜欢听到的答案是L1 正则化项是参数绝对值之和它的梯度在零点附近不连续导致优化过程中参数很容易被压到零所以天然具备稀疏性而 L2 正则化项是参数平方和梯度在零点附近连续且比例衰减参数会趋向于“小但不为零”。从几何上看L1 约束是一个菱形最优解更容易落在坐标轴上L2 约束是一个圆形最优解通常不在坐标轴上。这两个维度的解释一出来答案的层次感就上来了。再比如交叉熵损失函数。很多人只知道分类问题用交叉熵但说不清为什么不用均方误差。从原理上看逻辑回归用均方误差会导致损失函数成为参数的非凸函数优化时容易陷入局部最优而交叉熵配合 sigmoid 激活函数求导之后的梯度形式非常简洁不存在饱和区梯度消失的问题。这道题只要把“和 sigmoid 的配合”和“凸优化性质”这两个点讲透基本就是满分答案。3.2 两道容易被细节打败的题目第一道是“如何解决样本不均衡问题”。这道题看着简单但想拿全分并不容易。很多人上来就答“过采样、欠采样”只拿到基础分。完整的回答应该分三个层面数据层面可以做随机过采样、SMOTE 合成少数类样本、或者清洗多数类样本算法层面可以修改损失函数中的类别权重让少数类样本的误分类代价更高评价指标层面不能用准确率应该用 Precision、Recall、F1、AUC 等对不均衡更友好的指标。如果题目说的是出行场景比如滴滴的司机取消订单预测正负样本比例可能到 1:20 甚至更悬殊还会有时间维度上的样本偏移问题能想到这一层就更好了。第二道是“梯度和反向传播的手推题”。这类题目通常给一个简单的两层神经网络让你手动计算前向传播、反向传播或者给出某一个权重的梯度表达式。应对策略是把链式法则吃透同时在草稿纸上按“计算图”的方式逐步展开一个节点一个节点推导。具体写的时候先明确损失函数形式是 MSE 还是交叉熵再明确激活函数sigmoid 还是 ReLU然后从输出层倒推。我见过最可惜的情况是有人把 sigmoid 的导数记成了 1-sigmoid漏了“乘自身”这一步整道题结果全错。这种基础公式考前必须默写一遍再进考场。3.3 深度学习高频考点激活函数、CNN/RNN与经典网络深度学习在2017年已经是很热的方向了滴滴的题目里也出现了不少相关考点。选择题或简答题里激活函数是必考的尤其是“为什么 ReLU 比 sigmoid 好”这个经典问题。可以从三个方面作答首先是梯度消失问题sigmoid 在两端的导数趋近于0而 ReLU 在正半轴的导数恒为1梯度传递更顺畅其次是计算效率ReLU 只是做个阈值比较而 sigmoid 涉及指数运算最后是稀疏性ReLU 会把负数置零产生稀疏激活这在多层网络中有正则化效果。但也要提到 ReLU 的缺点——死亡 ReLU 问题即某些神经元的权重更新后永远为负导致该神经元再也不会被激活。能够指出问题并给出 Leaky ReLU 等改进方案说明你对这块是真懂。CNN 和 RNN 的题也出现过比如“CNN 中 1x1 卷积的作用”“RNN 为什么会梯度消失”。1x1 卷积的答案核心是通道维度的线性变换和降维通常用于改变通道数或增加非线性RNN 的梯度消失则要从时间维度上解释也就是反向传播沿着时间步展开后Jacobian 矩阵连乘导致梯度指数级衰减。这类题目的答题技巧是按照“是什么、为什么、怎么解决”的结构来组织不要只写一个结论要把背后的原理说透才能拿到高分。4. 数学与算法原理题概率、信息论与数据结构的交叉4.1 概率统计题算法岗笔试的“隐形门槛”在整理滴滴这套真题的时候有一个感受特别深很多人算法题刷得很顺却栽在概率统计题上。原因很现实——大学阶段概率论学完就忘了而笔试备考时又把大量时间花在刷代码题上忽略了数学基础的复习。概率统计在算法岗笔试里的地位极其重要因为机器学习模型本质上是概率模型不了解概率论很多东西只是表面会背。滴滴笔试题里出现过的概率题有几种典型形态一种是古典概型比如“从 n 个样本中有放回地抽取 k 次至少抽到一次特定样本的概率”考察的是对1减去补事件概率的利用另一种是条件概率和贝叶斯公式比如“已知检测准确率和假阳性率求检测阳性时真正患病的概率”这道题几乎是各大厂笔试的面熟题还有一种是期望计算比如“在长度为 n 的数组中随机取一个子数组求子数组和的期望”这类题往往和线性性质结合需要利用期望的线性可加性来简化计算。我在准备概率题时用了一个很笨但有效的方法把常见题型整理成一个文档每道题写出解题思路和关键公式而不是只记答案。比如全概率公式、贝叶斯公式、期望线性性质、方差分解公式这些不仅要会背还要会用在场景里。考试前一个小时拿出来翻一遍效果比临时抱佛脚好得多。4.2 信息论考点熵、交叉熵与KL散度的理解信息论在算法岗笔试中出现的频率越来越高尤其是做机器学习方向的同学熵、交叉熵、KL散度几乎成了必考概念。搜索词里提到的“KL ELBO 算法原理详解”和这个考点直接相关虽说 ELBO 更多是在变分推断里出现但笔试常见的还是这几个基础概念的辨析。熵代表一个系统的不确定性计算公式是 H(X) -Σ p(x)log p(x)。交叉熵是衡量两个概率分布之间差异的指标计算公式是 H(p, q) -Σ p(x)log q(x)分类问题里的损失函数就是用它。KL散度则是交叉熵减去熵D_KL(p||q) Σ p(x)log(p(x)/q(x))它衡量的是用 q 来近似 p 时损失的信息量。注意 KL 散度不满足对称性所以不是严格意义上的距离。关于这几者的关系面试官常问“为什么用交叉熵而不用 KL 散度作为损失函数”。答案其实很简单在训练集固定时真实分布的熵是一个常数最小化交叉熵等价于最小化 KL 散度。但交叉熵的计算形式更简洁所以都用交叉熵。能够把这个等价关系讲清楚面试官会认为你是真正理解了而不是背了公式。顺带提一句在生成模型里ELBO 是变分自编码器优化时的核心指标它和 KL 散度直接相关如果简历里写了 VAE 项目这个点很可能被追问。4.3 数据结构与经典算法除了代码题还会怎么考数据结构在笔试题里不仅通过编程题来考还会在选择题里以原理题的形式出现。比如说哈希表冲突的解决方法开放定址法、链地址法、再哈希法、建立公共溢出区每一个都要求能说出优缺点和适用场景。再比如二叉树的遍历序列给出前序和中序要求推导后序这种题要掌握“由前序确定根节点由中序分割左右子树”的递归思路手算时在草稿纸上画二叉树最稳妥。图论的考点同样丰富。Dijkstra 算法的前提条件是图中不能有负权边为什么因为 Dijkstra 基于贪心思想每次选择当前距离最短的节点加入已确定集合一旦存在负权边先加入的节点可能因为后续的负权边而变得不是最优贪心策略就失效了。那负权边要用什么Bellman-Ford 算法它通过多次松弛操作来逼近最短路径。这两个算法的对比是笔试选择题的高频考点。除了这些传统的原理题启发式算法也会出现在选择题或简答题里比如粒子群算法、模拟退火、遗传算法。这类算法在滴滴这类公司笔试中出现通常不是为了考代码实现而是考察你是否知道它们适用于什么场景。粒子群算法的核心是模拟鸟群觅食行为通过个体最优和全局最优来迭代更新速度与位置模拟退火的核心是允许以一定概率接受更差的解从而跳出局部最优。我在准备这类考点时会为每个算法写一段几句话的总结包括核心思想、关键参数、适用场景考前集中过一遍。5. 现场笔试的踩坑记录与避坑清单5.1 考场上的高频失误这些坑我替你们踩过了笔试氛围和平时刷题完全不同限时压力下会暴露各种平时注意不到的问题。我自己考过不少笔试也带过同学复盘总结出几个出现频率极高的失误类型在这里列出来你们备考时提前注意。第一个坑是审题不仔细。算法题最怕的不是不会做而是题目理解错。我见过有同学把“最多操作次数”看成“最少操作次数”写完一个 DP 提交后才发现题目读反了。这个问题看起来低级但限时状态下非常容易犯。我的习惯是在草稿纸上把题目的关键条件都圈出来包括数据范围、输入格式、输出要求、边界条件正式动笔前先花一分钟把题看完整。第二个坑是输入输出处理错误。在线笔试平台和 LeetCode 的函数形式不同很多用的是 ACM 模式需要自己处理标准输入输出。有些同学函数写得很顺结果卡在解析输入上尤其是处理“第一行是测试用例个数接下来几行是数据”这种格式时很容易出错。准备方法很简单提前熟悉目标公司笔试平台的输入输出模板把几种常见的输入解析模式都写一遍。第三个坑是时间分配失衡。算法岗笔试题量大、题型多如果前面选择题耗时过久后面的编程题很可能来不及做。我见过太多人前面的简答题花了二十分钟咬文嚼字最后一道编程题只剩十分钟代码写了一半就交卷了。笔试不是期末考试不是每题都要拿满分合理放弃个别难题保证整体完成度才是正确的策略。5.2 笔试中常见问题的速查表结合多次笔试中实际遇到的情况我整理了一份速查表按问题现象、可能原因、解决办法三列列出方便你在模拟笔试后对照自查。问题现象可能原因解决办法本地运行正常提交后报错输入输出格式不对或数组越界仔细核对题目要求检查数组边界条件和输入解析代码用例通过部分隐藏用例失败边界条件没处理比如空数组、单元素、只含负数在草稿纸上逐一列举边界用例尤其是 dp 初始化部分代码超时算法复杂度太高或者用了不合适的库函数重新分析复杂度考虑用空间换时间或换更优算法思路推导题写着写着思路断了概念掌握不透只记住了结论没理解推导考前把所有公式独立推导一遍不依赖资料时间不够用在前面题目上耗时过多规定每题时间上限超时先跳回头再补缺口选择题纠结太多对某个知识点不熟练在两个选项间犹豫基于第一直觉先选标记后跳过不要占用整体时间我在模拟笔试后会专门花时间复盘这张表对照自己本次考试中出现的失误找出最薄弱的环节进行针对性训练。这个方法比盲目刷题高效得多推荐你们也试试。5.3 实战建议笔试平台与工具的准备技巧除了知识储备工具准备同样不能忽视。不同的笔试平台使用体验差别很大有的平台只支持纯文本输入有的平台支持代码自动补全。提前一周注册目标公司的笔试模拟系统去试一下能避免很多不必要的低级失误。我一般会准备一个固定的“笔试环境”一个支持多标签页的浏览器、一个本地编辑器、一个在线 IDE 备选、一张草稿纸、笔。有人可能会觉得草稿纸是多余的但在推导 DP 转移方程或者画二叉树时草稿纸的用处极大。屏幕前空想五分钟想不出来的题在纸上画一画往往突然就通了。还有一个容易被忽略的是网络环境。在线笔试最怕的就是提交时断网尤其是编程题辛辛苦苦写完提交不上去。我的做法是尽早提交一版“基本能跑”的代码保底哪怕不是最优解先把分拿到后面再优化再提交。这个“尽早保底”的策略在很多笔试中都帮我避免了零分风险。如果你所在的网络不稳定尽量用有线网络或者信号好的热点不要在提交倒计时最后一分钟才上传。6. 三周备考规划把滴滴真题变成你自己的知识体系6.1 第一周过基础算法建立解题手感三周备考时间是我比较推荐的准备周期太长容易疲太短覆盖不全面。第一周的主线是“基础算法”目标是把手写代码的流畅度和正确率提上来。每天安排固定的刷题量比如三到五道题覆盖排序、二分、双指针、贪心、动态规划、图论、字符串这几个大类。做题时不要边看题解边写先独立想三十分钟实在没思路再查查完之后必须自己重新写一遍并且把核心思路记录在笔记里。针对滴滴这份真题我建议第一周先集中把动态规划和字符串匹配这两块吃透因为它们是笔试题中区分度最大的部分。动态规划需要掌握的经典模型包括背包问题、最长上升子序列、最长公共子序列、编辑距离、区间 DP、状态压缩 DP 的入门。字符串匹配则要掌握 KMP 的 next 数组推导和匹配过程的代码实现同时了解哈希匹配、滑动窗口等思想。第一周的练习不需要追求难度重点是覆盖面。我见过不少人上来就刷难题结果一周下来只做了十几道题基础反而不扎实。正确的做法是“广度优先”先把高频题型全部过一遍形成肌肉记忆再考虑深度。6.2 第二周主攻机器学习理论与数学基础第二周的主线从写代码切换到“理论”。每天分配两个时间段上午看机器学习基础理论下午做练习题和推导题。机器学习理论准备的核心资料是周志华的《机器学习》西瓜书和李航的《统计学习方法》这两本书覆盖了算法岗笔试中大部分理论考点。重点章节包括感知机、逻辑回归、SVM、决策树、集成学习、聚类、降维、贝叶斯分类、EM 算法、概率图模型的名词与思路。第二周的目标要求更高一些不只是看懂而是能独立推导。比如逻辑回归的损失函数是怎么从最大似然估计推导出来的进而得到交叉熵形式SVM 的优化问题为什么可以转化为对偶问题KKT 条件在解中扮演了什么角色。这些推导看起来耗时但对笔试简答题的帮助是决定性的。我在引导学弟学妹时经常说能把公式推一遍的人才算是真正掌握了这个模型。数学基础的复习也要同步进行。概率论要重点复习条件概率、全概率公式、贝叶斯公式、期望、方差、协方差、常见分布伯努利、二项、高斯、泊松、最大似然估计、中心极限定理的概念。线性代数方面要掌握矩阵乘法、特征值分解、奇异值分解、正定矩阵这些概念尤其是 SVD 和 PCA 的关系。信息论方面掌握熵、交叉熵、KL 散度以及和机器学习损失函数的关系。这些数学知识不需要单独刷题跟着机器学习理论的复习穿插进行即可。6.3 第三周真题模拟与错题回顾把知识变成答题套路第三周的主要任务是“模拟”。找两到三套完整的算法岗真题按照正式笔试的时长限制和时间分配来做。模拟时严格限制时间不翻阅任何资料完全模拟考场状态。做完之后不要急着对答案先自己复盘哪些题不会、哪些题答错、哪些题耗时过多把这些问题记录下来再针对性地查漏补缺。错题回顾是这个阶段的重中之重。我在备考时做过一个错题本按照“题型、考点、错误原因、正确思路”四栏整理。这样做的好处是到了考前一两天不用再重新翻厚厚的学习资料只需要看错题本就能知道自己的所有薄弱环节。错题本是临考前的救命稻草。第三周还要做一件很重要的事情总结答题套路。比如推导题不管什么模型都可以按“建模、推导、解释”的结构来答代码题不管什么类型都先写解题思路再写具体实现让阅卷人能看懂你的思维过程场景设计题则按照“理解业务、抽象问题、提出方案、评估方案”的框架来组织。形成自己的答题框架后考场上面对任何题目都不会慌因为你知道该从哪个角度切入。另外第三周还要把高频的面试延伸问题过一遍。比如你简历里写了用过某算法就要准备回答“为什么用这个算法而不是另一个”“算法的复杂度是多少”“有哪些局限性”。滴滴这类大厂的笔试通过之后很快就是面试笔试备考和面试准备可以适当打通互相补充。7. 场景设计题与岗位匹配度一份真题背后的延伸思考7.1 滴滴式场景题从业务问题到算法方案场景设计题是滴滴 2017 秋招算法岗笔试题里很出彩的一部分也最能反映“算法工程师”和“码农”的区别。给一个出行场景比如“高峰期如何为司机和乘客进行订单匹配”这题如果从纯算法的角度回答只讲二分图最大匹配是远远不够的还要考虑业务约束乘客等待时间、司机接驾距离、顺路程度、全局最优与局部最优的权衡、公平性、实时流式计算等。回答这种题目我推荐的框架是先拆解业务目标再定义优化目标然后提出方案并分析优劣。以订单匹配为例业务目标是让乘客尽快上车、让司机少空驶平台整体订单成交率最高。这个目标可以形式化成一个带约束的优化问题在给定时刻把 n 个乘客和 m 个司机进行匹配目标是最大化总成交概率或最小化总接驾时间。约束条件包括每个司机只能接一单、每个乘客只能被分配一个司机、接驾距离不能超过某个阈值等。在数学形式化之后再谈解法如果是小规模静态匹配可以用 KM 算法或二分图最大权匹配如果是大规模在线匹配则需要贪心加局部优化的思路甚至引入强化学习来动态调参。我在实际讲解这种题目时会特别强调一个点算法岗的答案不是“对错”问题而是“好坏”问题。你需要明确地表达出“什么是好”的评判标准然后围绕这个标准来设计技术方案。具备这种从业务目标到算法建模的能力正是算法工程师岗位的日常状态。7.2 算法岗笔试之外的思考热词背后的行业算法谱系整理这份真题时我顺手看了一下搜热词里的算法粒子群算法、音频重采样算法、数据结构排序算法、机器学习算法、深度学习算法、规则引擎 Drools 的 Rete 算法、冒泡排序、贪心算法、KL ELBO、剪枝算法、PID 算法、模拟退火、堆排序、Dijkstra 算法、图像锐化的拉普拉斯算法、MPPT、FOC、卡尔曼滤波……这个列表几乎覆盖了算法岗位的方向全景。如果你申请的是滴滴的网约车算法岗位那么概率图模型、ETA 预测、供需预测、路径规划这些方向的权重非常高如果你面的是推荐算法岗那么排序学习、CTR 预估、Embedding、多目标优化是重点如果你面的是视觉算法岗那么图像分类、目标检测、图像锐化、注意力机制这些深度学习方向是核心。我的建议是先用滴滴这份真题来摸底再看岗位方向针对性加深。算法岗笔试不可能覆盖所有算法但会覆盖你目标岗位最核心的算法。7.3 我个人的一点体会笔试考的是长期积累不是短期突击带过不少人备考算法岗之后我越来越觉得笔试成绩和准备周期之间的关系不是线性的。有人刷题三个月却拿不到面试机会有人集中突击两周就能过笔试区别通常不在于刷题数量而在于基础是否扎实。数据结构、算法复杂度、数学推导这些底子好的同学短期冲刺效果极其明显反之如果基础不牢刷再多题也只是浮于表面。准备滴滴这套真题也好准备其他大厂笔试题也好我认为最核心的方法就一条把每道题的价值榨干。不是做完了对完答案就结束了而是分析题目背后的考点、出题人的意图、同类题的变形方式。一道经典题花四十分钟把它的变体、边界情况、复杂度分析全部理清楚抵得上盲目刷十道题。还有一个建议是不要把笔试和面试割裂开来。笔试中发现的薄弱知识点往往就是面试中会被追问的知识点。准备笔试的过程本质上就是在为面试做准备。我把每一道题都当作一次“预面试”来对待边做边想如果面试官问我这个知识点我能不能讲清楚。抱着这种心态准备收获会比单纯刷题大得多。希望这套真题的拆解方法和备考思路能真正帮到正在准备算法岗的你也希望大家都能在校招中拿到心仪的 offer。