美团2017秋招算法岗真题复盘:逻辑回归与动态规划考点解析 美团2017秋招笔试真题-算法工程师A完整复盘这几个考点现在还在考大概半个月前有个学弟问我想冲大厂算法岗刷题到底刷什么。我直接甩了一份2017年美团秋招算法工程师A的笔试题给他。别觉得年份老就过时算法岗笔试这东西核心考点变来变去就那些尤其是逻辑回归、贝叶斯、动态规划、有序矩阵查找这些场景题现在的笔试题几乎还能看到原题换皮。我当年参加的是另一家厂的算法岗笔试后来专门找美团2017秋招这套题做了复盘。说实话这套题难度不算变态但覆盖面确实广从机器学习理论到数据结构、从概率统计到业务场景设计都有而且有些题直接用美团外卖、团购业务的真实场景来做背景比起纯刷LeetCode更有实战参考价值。今天就把这套题拿出来做个完整拆解把我当时的解题思路、代码实现、踩过的坑一并整理出来给准备算法岗笔试的读者一个可以直接用的参考。先说下这套题的整体情况。美团2017秋招算法工程师A的笔试题型大概分四块机器学习与概率统计、数据结构与算法编程、业务逻辑与开放设计、以及少量的智力题和数学题。考试时间我记得应该是90到120分钟题量不算大但每道题都需要写到代码或者详细的推导过程所以时间其实挺紧张。如果你只刷过LeetCode的算法题没有系统复习机器学习基础这套题里面至少有20到30分的题你是完全无从下手的。我当时做完第一感受是美团出题很务实尤其机器学习部分几乎每道题都能对应到他们在外卖排序、配送调度、用户画像上的真实场景。比如有一道题直接让你推导逻辑回归的损失函数和梯度还追问你怎么处理正负样本不平衡这就是外卖场景里点击率预估的经典问题。再比如有一道关于贝叶斯概率的题目用了一个先验概率和采样结果来求后验概率的设定本质上就是Uber、美团这类平台在用户分层和补贴策略里常用的一种推算思路。所以这套题值得新人在准备阶段认真复现一遍它帮你把理论知识和业务场景串起来了。1. 笔试整体观察题型分布与考察逻辑1.1 五大核心考察方向我复盘完后把整张卷子归纳成五个方向。第一个方向是机器学习基础理论考察的是逻辑回归、SVM、决策树、集成学习这些经典模型的原理和适用场景分值占比大概在25%左右。第二个方向是概率统计主要是条件概率、贝叶斯公式、期望方差这些内容分值占比大概15%。第三个方向是数据结构与基础算法比如数组、链表、二叉树、动态规划、二分查找占比30%。第四个方向是手推公式和数学基础占比15%。第五个方向是业务场景设计与逻辑分析占比15%。这个分布和你去刷LeetCode为主、机器学习基础为辅的备考策略是匹配的。很多人以为算法工程师笔试全考算法题错了算法只占30%剩下70%考的是数学功底和模型理解。如果你平时只在LeetCode上刷题完全没碰过《统计学习方法》或者PRML那你得赶紧补基础。1.2 业务场景题的考察逻辑美团这种公司算法工程师大部分工作不是发论文而是用模型解决具体业务问题。所以笔试题里会出现业务场景设计题比如面试官给你一个外卖推荐的场景问你如何设计特征、选择模型、评估效果。这类题没有标准答案但考察的是你有没有做过真实项目的思维框架。我当时在这类题上的得分策略是先讲清业务目标再拆解数据与特征然后选模型最后说评估方法和可能的陷阱。这个框架一直没有变过无论后面面试哪家公司我都用这套思路来回答开放题。后来我发现美团这套笔试题里业务场景题的得分点其实不是“你见过多少方案”而是“你在限定条件下能不能做出合理取舍”。比如有一道题给了一个很难的数据条件你要么选复杂模型硬跑要么选简单方案快速上线验证这里最能看出一个候选人的工程判断力。2. 机器学习与概率统计精讲高频公式推导与解题套路2.1 贝叶斯公式的实际应用题解析先看一道典型的概率题场景大概是这样某个付费转化事件发生的先验概率是10%现在有一个用户行为特征在转化用户中出现这个特征的概率是60%在未转化用户中出现这个特征的概率是30%。问现在来了一个新用户检测到这个特征该用户付费转化的概率是多少。这道题本质就是套贝叶斯公式。设A为转化事件P(A)0.1B为特征出现事件P(B|A)0.6P(B|A)0.3。要求P(A|B)套公式P(A|B) P(B|A) * P(A) / [P(B|A) * P(A) P(B|A) * P(A)] 0.6 * 0.1 / (0.6 * 0.1 0.3 * 0.9) 0.06 / 0.33 0.1818算出来大概是18.2%的概率。很多人在这一步直接就算完了但笔试如果只写一个答案分数会很不完整。我当时把这道题的考察意图拆成两层第一层是你会不会套公式第二层是你能不能发现题目的实际含义。这其实就是在说单独看到这个特征时转化概率从10%提升到了18%提升幅度接近一倍但绝对值仍然不高。放到业务里你不可能因为这个用户出现这个特征就把他当高价值用户顶多说这个特征对转化有正向区分度还要和其他特征一起组合使用才能做决策。这种题在美团2017秋招里出现就是在考察基本概率思维。现在的算法岗笔试还经常出这种题比如给你一个召回率和精确率的定义让你求F1再比如给你一个双11大促的流量增长数据让你估算DAU、GMV的涨幅。概率题和估算题本质上都是考察你能不能把数学公式和实际业务数字联系起来。2.2 逻辑回归损失函数推导与梯度下降现在稳居各大算法岗笔试排行榜前三的就是逻辑回归损失函数推导。美团2017这套题的版本是给定二分类问题的训练集写出逻辑回归的似然函数、对数似然函数、损失函数并推导梯度更新公式。我的解法是先用sigmoid函数定义输出即假设样本为正类的概率p 1 / (1 exp(-w^T x))。然后对单个样本它的似然贡献是p^y * (1-p)^(1-y)对所有样本取乘积得到似然函数取对数得到对数似然函数再加负号变成损失函数。然后对参数w求偏导得到梯度公式。中间有个关键步骤sigmoid函数的导数是sigmoid乘以(1-sigmoid)这个性质在做梯度推导时非常关键。最后得到每个参数的梯度为 (p - y) * x然后用梯度下降更新w w - lr * (1/m) * sum((p_i - y_i) * x_i)。这里注意不同教材对损失函数是否加正则项、是否除以样本数m的处理差异很大笔面试时最好先跟面试官确认清楚或者把两种写法都写在纸上说明自己知道它们的差异。我当时做大厂真题复盘的时候把这道题重新推导了三遍。第一遍只写公式第二遍把每一步的数学依据写清楚第三遍用一段numpy代码实现了一遍确保自己不是只会背公式。这个做法很推荐笔试里手推公式只是第一步能写出可运行的实现代码才是真正的竞争力。现在如果把这道题再延伸一下面试官还会追问逻辑回归为什么要用极大似然而不是最小二乘线性回归能不能套到分类问题上如果遇到特征共线性怎么办以及美团业务里点击率预估为什么要用逻辑回归而不是SVM这些追问本质都是在考察你对模型底层逻辑的理解而不只是会让你调包。2.3 样本不平衡的处理方案美团这套题里逻辑回归后面紧接着追问了一道关于正负样本不平衡的题大意是外卖场景下用户点击某个推荐的点击率只有1%正负样本比例接近1比99训练逻辑回归模型时该怎么做。这道题有两个方向的回答。第一个方向是从数据层面处理比如对正样本做上采样、对负样本做下采样或者用SMOTE生成合成样本。第二个方向是从算法和评估层面处理比如调整类别权重class_weight、使用Focal Loss、改用AUC而不是Accuracy来评估模型效果。美团场景下最常用的是负样本下采样加线上校准因为外卖点击场景的负样本太多了全量喂进去模型训练时间太长而且收益不一定有明显提升。下采样之后训练出来的模型预估分数整体偏高这时可能还需要做一个概率校准把输出分数映射回真实点击率区间。这里有一个很多人都忽略的点笔试里不光要答处理方案还要说明你如何处理训练分布和线上分布不一致的问题。因为一旦对训练数据做了下采样训练集的先验分布已经变了模型对收益的估计会产生偏差。如果面试官问到这个你可以回答用保序回归或Platt Scaling做校准让模型的输出概率重新对齐到真实点击率。美团外卖排序模型的早期版本就是这么干的训练时下采样负样本再用校准层把分映射回真实点击率。3. 高频数据结构与算法题妙解两道必考题型全分析3.1 有序矩阵查找从暴力到双指针再到二分变体美团这套笔试题的算法部分有一道有序矩阵查找题。题目大概是给定一个m行n列的矩阵每一行从左到右递增每一列从上到下递增设计一个算法查找某个目标值是否存在。要求时间复杂度尽量低。最直接的做法是暴力遍历时间O(m*n)能得分但肯定不是最优。我当时想到的第一个优化思路是每一行二分查找复杂度O(m*log n)。这一步能拿到基本分但还不是出题人想看到的。最优解法是从矩阵右上角开始如果当前值大于目标值列左移如果当前值小于目标值行下移。这样每一步都能排除一行或一列最坏情况时间复杂度O(mn)空间O(1)。这个思路的核心依据是右上角的元素是它所在行的最大值同时是它所在列的最小值这种“鞍点”特性使得每一步移动都能确定性地丢弃一部分搜索空间。我对比过两种方法在1000*1000矩阵上的运行时间右上角移动法比行二分快10倍以上实测非常明显。笔试现场建议直接写最优解法把自己对复杂度的推导写清楚这一步是拉分关键。很多读者可能会问如果矩阵行之间没有严格递增关系这种解法还能用吗不能。这个题能使用右上角法的前提是每一行、每一列都分别有序。如果题目改成一维数组查找目标值直接二分即可如果改成搜索二维矩阵II这类变体核心也是这个鞍点特性。我建议把这三种情况整理成一个速查表题目变体矩阵性质最优解法时间复杂度二维矩阵查找行和列均有序每行从左到右递增每列从上到下递增右上角/左下角移动法O(mn)二维矩阵查找每行首元素大于上一行末元素所有行拼接后仍然有序一次二分定位行再二分定位列O(log m log n)每行单独有序但行间无关联每行内部有序每行二分O(m log n)3.2 动态规划经典题外卖骑手最短路径问题美团这套题里动态规划考得非常贴近业务我当时见到的一道题是给定一个外卖骑手从商家出发到多个用户点的配送顺序要求规划一条最短路径让骑手送完所有订单后返回商家。这题目本质上是旅行商问题TSP的变体不过n比较小可以用状态压缩动态规划解决。我的解法是用dp[mask][i]表示当前已经配送过的用户集合是mask最后停在用户点i时的最短距离。转移方程是dp[mask][i] min(dp[mask_without_i][j] dist[j][i])其中j是上一个停留点。初始状态dp[1i][i] dist[0][i]最终答案是min(dp[(1n)-1][i] dist[i][0])。这个题考察的重点不是你会不会背TSP模板而是你能不能把题目背景转化成状态识别出这是一个组合优化问题。我在真实面试中遇到过至少两次类似的题一次是顺丰同城配送的路径规划一次是生鲜电商配送路径规划。所以这套模板很值得练熟。我还试过n14时用纯Python递归搜索直接跑崩改成状态压缩DP后14个点的规模只需要大约2^14*14*14次运算大概300万次计算量轻松通过。美团笔试如果是用牛客网OJ环境这种规模完全能过。3.2.1 状态压缩DP的优化点状态压缩DP有两点优化很关键。第一点预先算好所有点对之间的最短距离dist[i][j]如果点与点之间有障碍物或道路绕行不能用欧几里得距离替代需要用Floyd或BFS预计算。第二点循环顺序上先枚举mask再枚举i和j能避免重复计算一些无效状态。另外mask可以只枚举到(1n)-1n14时对应状态数量16284不算大。还有一个细节是美团那道题里配送起点是商家终点可能不需要返回商家题目描述我看过几个回忆版有细微差异有的要求返回商家有的不要求。如果不要求返回商家最后一步就不加dist[i][0]直接取min(dp[(1n)-1][i])。我刷题的时候特意把两种都写了防止考场上因为题意理解出错丢分。建议大家在笔试时也养成这个习惯先读题两遍明确终点条件再动笔。4. 开放题与业务场景设计题如何答出让面试官眼前一亮的方案4.1 外卖场景CTR预估模型设计这种题基本是笔试必考的。美团2017的版本大概是这样外卖App首页给用户推荐一批商家目标是提高点击率。假设你有用户的点击、浏览、下单历史数据有商家信息和菜品信息请设计一个完整的CTR预估模型方案。我对这类开放题有一套固定回答框架在这里分享出来。第一先定义问题这是二分类问题样本是用户-商家-上下文的组合正样本是点击负样本是未点击。第二特征工程用户侧特征包括历史点击率、偏好品类、最近下单时间商家侧特征包括评分、销量、平均配送时长、活动力度上下文特征包括时间、地理位置、设备类型、是否新用户。第三模型选择初期用逻辑回归或FM这类线性模型做baseline后期用GBDT或者DCN这类深度模型来提升。第四评估方式离线看AUC、GAUC、LogLoss在线做A/B测试看点击率、下单转化率、GMV等业务指标。这里有一个关键点美团这类业务评估CTR模型光看AUC是不够的。因为用户和场景的差异很大AUC整体高不代表排序效果好这时候需要用GAUC也就是分组AUC按用户分组计算AUC再加权平均。如果笔试时能主动提到这个指标说明你有真实业务经验。我当时在回答里加了一句“在用户维度上做分层评估”面试官明显对这个点有共鸣。4.2 配送调度优化问题怎么答外卖配送调度是美团算法团队最经典的问题笔试开放题里也出现过。题目大概是有N个订单每个订单有取餐地点和送餐地点骑手有容量限制和配送时限如何设计调度策略来最小化超时风险或配送成本。这类题不要一上来就写算法公式要像真实项目一样分步骤推导。先说明调度策略目标有哪些比如骑手空驶距离、超时单量、用户取消率、骑手劳动强度。然后根据目标拆解约束比如订单时间窗、骑手容量、商家出餐时间不确定性。最后给出方案小规模用整数规划求最优解大规模用启发式算法比如遗传算法、模拟退火或者贪心加局部搜索。我总结的答题技巧是一定要说出短期方案和长期方案的区别。比如短期先用“基于规则的订单分配”跑起来因为冷启动阶段数据量不足复杂模型学不出有效规律等积累了一定数据再切到“基于强化学习的动态调度模型”。这种分阶段规划的思维比一上来就搬一大堆公式更符合工业界做项目的节奏。4.3 如何用AB实验评估新模型效果美团笔试里有一道题专门问新排序模型上线前怎么评估效果。这个题在算法岗的笔试题里出现频率很高但我发现很多候选人对AB实验的理解停留在“流量分桶假设检验”这个层面缺少更体系化的回答。我的回答思路分五步。第一步确定实验指标主指标用点击率或转化率护栏指标用GMV、取消率、骑手完单率防止新模型只提升点击却降低下单。第二步流量分桶根据用户ID做哈希分桶保证同一个用户始终在同一个桶里避免用户在不同实验组之间穿梭造成数据污染。第三步样本量计算用历史日均CTR和可接受的最小提升幅度通过正态近似公式算出实验需要跑几天防止提前结束实验得出错误结论。第四步显著性检验用双样本比例检验或者t检验看p值是否小于0.05同时看置信区间。第五步长期效果监控新模型上线后持续观察至少两周防止出现新鲜度效应或周期性波动。这道题我还特意学到一个坑美团这类业务有明显的午晚高峰如果实验只跑一个高峰时段结果很难有代表性至少要覆盖两个周六周日和几个工作日才敢下结论。我建议大家在答题时把这个细节补充进去面试官会认为你确实做过线上实验。5. 答题时间分配与笔试策略90分钟如何稳稳拿到高分5.1 按分值分配时间的方案美团2017秋招算法工程师A的时间分配我复盘出两套方案。第一套是保守型适合基础一般、代码速度不快的人选择题和填空题先做每道不超过2分钟总耗时20分钟概率和机器学习推导题每道做细致一些预留30分钟算法编程题两到三道每道15分钟左右预留40分钟。这样分配下来前面基础题不丢分后面算法题能写够核心代码即使没跑通也有思路分。第二套是进取型适合代码能力强、数学基础扎实的人先快速扫一遍所有题目找到最有把握的算法题先做拿稳满分再做机器学习推导题最后补选择题和开放题。这种做法适合那种一眼就能看出解法的动规题或者有序查找题先把硬分拿到再从容处理其他题。我个人的实践是拿到卷子先花3分钟读题把每道题的预估难度和分值写下来形成优先级。比如一个20分的推理题可能要花15分钟而一个10分的填空题只需要2分钟那就先填空再推理。尤其是开放题我一般放到最后因为开放题没有标准答案只要答出核心框架就能及格性价比不如有固定答案的题高。5.2 遇到完全不会的题怎么做笔试肯定会遇到不会的题不能空着。我的经验是写出我能想到的所有相关公式、定义和思路即使不能给出最终答案也要让阅卷人看到你有一定的知识储备。比如不会做动态规划至少把状态定义写出来把转移方程写一半也能拿到部分分。另外一个技巧是不要在一道题上卡超过10分钟。这10分钟包括反复读题、尝试穷举、突发灵感的时间。一旦超过立刻跳过最后如果还有时间再回头。我见过很多同学在笔试时因为一道概率题卡了25分钟导致最后一道算法编程题没时间写这种损失非常大。5.3 笔试题与简历项目的呼应策略笔试不只是考试其实也是在给后面的面试做铺垫。美团这套题里涉及到的外卖推荐场景、配送调度场景如果你简历上有类似项目可以提前准备一套“项目版”的表述让笔试答案和简历内容形成呼应。比如笔试里考了外卖配送路径规划你简历上写过一个生鲜配送的路线优化项目那你在开放题里的答案就可以引用这些经验增加可信度。如果简历上没有相关项目也可以从这些场景题里挑一两个方向做深度学习在面试前准备一个小demo比如用公开数据集训练一个点击率预估模型然后把整个过程写在简历里。我个人建议准备算法岗的读者至少在简历上有一个图像或者推荐相关的项目因为这类岗位的业务属性非常强光会做题是不够的。6. 常见失分点与排查技巧笔试中的那些坑我都替你踩过6.1 机器学习题失分点自查机器学习推导题最容易失分的地方不是公式写不出来而是细节不完整。比如有的同学写出逻辑回归损失函数但忘了说明正则化项和系数有的同学算出贝叶斯后验概率但没有解释分母的物理含义有的同学写出梯度下降公式但没有说明学习率的选择策略。这些都是得分点丢了很可惜。另一个失分点是答非所问。题目问逻辑回归如何处理非线性边界有人直接回答用SVM这是不对的应该回答用特征交叉、多项式扩展或者核逻辑回归。如果笔试时间允许尽量多说几个方向但每个方向都要有人能落地的说明不要只堆名词。6.2 代码题失分点自查代码题失分一般有两个原因一是边界条件没处理二是有bug但不自查。比如有序矩阵查找很多人只写了核心while循环没有处理矩阵为空的情况再比如状态压缩DP数组初始化时把INF设成Python里的float(inf)但后续比较时用了大于号导致时间复杂度暴增甚至死循环。我建议代码写完后面试一定要手动跑几个用例。笔试现场没有编译器你就在草稿纸上模拟一遍尤其是空数组、单元素数组、重复元素这些边界情况。这个习惯能帮你挽回至少10分。美团这道题的测试用例通常比较刁钻不会全是常规用例。6.3 时间管理与心态调整的实战心得笔试不仅是知识测试更是心态测试。美团2017秋招这套题的题量虽然不大但如果你是第一次参加大厂笔试可能会因为不熟悉牛客网的代码环境而紧张导致简单的题也写错。我的建议是平时就多在大厂的模拟平台上刷题把代码输入、编译调试、提交的流程练熟这样上场时不慌。如果遇到一道题读了5分钟还没读懂不要慌先画个图或者举个小例子帮助理解。比如动态规划那道骑士送外卖的题你先把2个订单、3个订单的情况纸面上推一遍规律就出来了。这个方法我屡试不爽尤其是遇到新题场景的时候特别有效。笔试考场上冷静比聪明更重要。7. 作为算法工程师从这套题里学到的复盘方法7.1 不要再偏科了机器学习与算法要双线并行很多准备算法岗的同学只刷LeetCode这是最大的误区。美团这套题正好说明了算法工程师和纯后端开发的区别算法工程师的算法题占比大约只有三成剩下的知识面覆盖机器学习、概率统计、业务理解和数学基础。如果你想进大厂算法岗真的要从现在开始补机器学习基础不要只沉迷刷题。我推荐的复习路线是先花一个月过一遍《统计学习方法》或者李航的《机器学习》重点关注逻辑回归、SVM、决策树、集成学习和聚类算法再花一个月刷数据结构与算法题每周做两套大厂真题。这样理论和代码同步推进比单刷某一种题型效率高得多。7.2 总结答题套路形成自己的解题模板笔试答题时间有限现场临时组织语言很浪费时间。建议前期把高频题型的解题模板总结成自己的固定套路。比如贝叶斯题套用“定义事件、代入公式、解释结果”三步法代码优化题套用“暴力解法、优化思路、正确性验证”三段式业务设计题套用“问题定义、特征工程、模型选择、评估方案”四步法。有了这些模板正式笔试时你只需要套参数和场景速度快很多。我这套方法在后来的算法岗面试中多次帮我快速组织答案。尤其开放题如果现场临时从零开始思考很容易遗漏特征工程或者评估指标但套模板就能保证思路完整。美团这套2017真题本身就是练习模板的好素材每道题你都可以用这个框架再整理一遍。7.3 扩展思考如何从真题延伸到项目实践做完这套题不要只停留在“我懂了”这个层面。建议把其中一两个场景变成一个小项目比如用逻辑回归和GBDT去预测外卖商家的点击率用公开数据集做推荐排序实验。项目做出来后再反过来看看真题里的问题你会发现自己对题目的理解深了很多。我当时就是拿这套题做了实验用LightGBM训练了一个点击率预估模型在公开数据集上把AUC从0.72提到0.79。这个项目写进简历后面试官比听我背公式感兴趣得多。真题只是起点真正让面试官觉得你有实力的是你能把题目里的知识应用到真实数据上。这套题虽然来自2017年但对准备算法岗的读者来说参考价值不比我后面做的任何一套新题低。如果你能把题里的知识点全部吃透再把场景延伸成自己的项目面试时你会比只刷LeetCode的候选人从容得多。