美团2017秋招算法工程师笔试真题解析:考点与备考策略
2026/9/11 7:22:25 网站建设 项目流程

算法工程师这个岗位的秋招笔试,向来是筛选简历之后第一道大坎,也是淘汰率最高的一环。美团2017秋招笔试真题-算法工程师A这份卷子,我当年也做过,后来带新人的时候又翻出来拆过好几遍。别看是2017年的题,很多考点放到现在依然能打,尤其是机器学习基础、概率统计、数据结构编程和业务建模这几块,几乎年年换汤不换药。如果你正在准备大厂算法岗笔试,或者刚入行想搞清楚算法工程师笔试到底在考什么,这篇文章可以帮你把考察逻辑、高频考点和备考方向一次性梳理清楚。

1. 这份真题在考什么:从试卷结构看考察意图

1.1 当年美团算法岗的岗位画像

2017年的美团正处于O2O快速扩张的阶段,外卖、到店、酒旅、配送这几条业务线都在大规模铺开。算法工程师这个岗位在那个时期不是做纯research,而是非常贴近业务的:外卖推荐列表、搜索排序、配送调度、补贴定价、风控反作弊,每一个方向都需要算法工程师把数学模型落到真实场景里。

所以笔试出题人的思路很直接:不考那种“背熟公式就能拿分”的题目,而是把业务中常见的数学问题、模型问题、编程问题抽象出来,看你在有限时间里能不能反应快、推导稳、代码不翻车。这也解释了为什么这套卷子里同时出现了机器学习理论题、概率计算题、数据结构和编程题,以及一小部分开放式的业务建模题。

1.2 整卷题目模块盘点

从试卷A的整体构成来看,基本可以分成四个大模块:

  • 选择题/填空题:覆盖机器学习概念、概率统计、线性代数、数据结构复杂度、基础SQL等。这部分题量大、分值分散,主要用来快速筛掉基础不牢的人。
  • 简答/推导题:要求手推某个模型的目标函数、梯度更新公式,或者给一个具体业务场景,计算某个概率、期望,考察数学基本功。
  • 编程题:手写一到三道中等难度的算法题,常见的方向是字符串处理、数组操作、动态规划、二分、贪心。
  • 业务场景题:给一段业务描述,让你设计解决方案,包括目标拆解、特征选择、模型选型、评估指标。

这四个模块看起来都是常规操作,但美团的题目喜欢在描述上绕弯子。比如同一个知识点,换个业务包装,很多人就识别不出来了。这是整套卷子最值得复盘的地方。

1.3 设计这套题的人到底想筛掉什么

我后来自己面人、出题的时候才真正想明白,这套真题的筛选目标不是“知识点最多的人”,而是这三类人:

第一,基本概念不扎实的人。很多人简历上写得天花乱坠,但问到“L1正则化和L2正则化在优化上的本质区别”就讲不清楚。选择题里用几个场景一包装,立刻原形毕露。

第二,不会把业务问题抽象成数学模型的人。美团特别喜欢给业务场景,比如“外卖骑手平均配送时长怎么预估”、“新店没有历史数据怎么做推荐”,这类问题没有唯一答案,但能看出你有没有建模思维。

第三,现场写代码不稳的人。笔试编程题不像LeetCode可以反复调试,时间一到就交卷。能在40分钟内写出一个无bug的解法,比写一个复杂精妙但超时的解法重要得多。

2. 机器学习与模型原理:从公式到业务理解

2.1 机器学习核心概念的考察深度

这套真题在机器学习概念上的考察,不是简单问“什么是过拟合”,而是给一个具体场景让你判断,或者让你在几个方案里做选择。常见的方向有这么几个:

  • 偏差与方差:给你一个训练集误差很低、验证集误差很高的模型,判断是偏差问题还是方差问题,该用交叉验证、正则化还是增加数据。
  • 正则化:问L1和L2的区别,为什么L1能产生稀疏解。这个问题的标准解释是L1的约束区域在坐标轴上有尖角,更容易在坐标轴上取到最优解。
  • 特征处理:连续特征离散化、类别特征one-hot、缺失值用均值还是中位数填充,各自有什么优缺点。
  • 交叉验证:K折交叉验证怎么划分数据,为什么要用分层采样,时间序列数据能不能随机打乱。

这些概念本身不难,但真题里喜欢混着出。比如给你一段特征工程的描述,问“这样做会导致过拟合还是欠拟合”。如果你只记结论、不理解背后的数据流,很容易被绕进去。

我复盘的时候给团队列过一个自查清单,每个候选人都该问自己:能不能不看资料,说清楚为什么L2正则化等价于权重衰减?为什么逻辑回归用交叉熵而不用均方误差?这些问题的回答深度,决定了你不是在背八股。

2.2 三个高频模型:LR、SVM、GBDT

在2017年美团这套卷子里,逻辑回归、SVM、GBDT是出现频率最高的三个模型。原因也很实在,这几个模型在当时的推荐、广告、风控场景里是绝对主力。

逻辑回归的重点在两点:一是它的损失函数为什么是交叉熵,二是它的梯度更新公式怎么推导。很多人在面试时会说“LR的损失函数是交叉熵”,但笔试要求你现场写梯度推导,就卡住了。本质上是把极大似然估计的负对数似然作为损失,然后对参数求偏导。

SVM的重点在“间隔最大化”和对偶问题。笔试题一般不会让你完整推导整个SVM,但会考“支持向量到超平面的距离公式”、“什么是KKT条件”、“为什么SVM对高维稀疏数据效果好”。这里有一个容易忽略的细节:SVM只关注支持向量,所以它对异常值比较敏感,这一点和LR不同。

GBDT在2017年已经很火了,但笔试里不会让你手推整个算法,更多是考“每一轮拟合的是什么”。标准答案是拟合损失函数关于当前模型的负梯度,也就是残差的近似。很多人会回答“拟合残差”,这在回归问题里没错,但严格说是负梯度方向。这个细节能区分你到底真懂还是背过。

我建议复习的时候把这三个模型放在一起对比:损失函数、优化方法、正则化方式、适用场景、对异常值敏感度、特征尺度是否敏感。这一张表列清楚,选择题基本稳了。

2.3 一道典型的模型推导题与完整解答

我根据当年同类考点的风格,整理了一道很典型的推导题,供你练手:

题目:给定线性回归模型 y = Xw + ε,其中 X 是 n×d 的样本矩阵,y 是 n 维标签向量,w 是 d 维参数向量。目标函数为:

L(w) = ||y - Xw||² + λ||w||²

其中 λ > 0 是正则化系数。请推导 w 的闭式解,并说明 λ 的作用。

这道题考了两个东西:一个是矩阵求导,一个是正则化理解。对 w 求梯度并令其为零:

∂L/∂w = -2X^T(y - Xw) + 2λw = 0

整理一下:

X^T X w + λw = X^T y

所以:

w* = (X^T X + λI)^(-1) X^T y

这个结果就是岭回归的闭式解。λ的作用可以从两个角度理解:一是数学上,当 X^T X 不可逆时,加上 λI 之后矩阵一定可逆,保证了唯一解;二是从模型角度,λ 越大,w 的模长越小,模型的复杂度越低,越不容易过拟合。

我当时做题的时候在这里吃过亏,推导出来后没有补充解释 λ 的行为,被扣了分。后来我复盘才明白,笔试不只考计算,还考你对结果的理解。光写出公式只能拿一半分,能把每个符号背后的含义讲明白,才是算法工程师该有的状态。

3. 概率统计与数学基本功:笔试里最容易被扣分的部分

3.1 贝叶斯公式:看着是送分题,错的人反而多

概率统计在美团这套题里占的比重不小,因为推荐、风控、定价都大量依赖概率思维。而最常见的一类题目就是贝叶斯公式。

我根据当年风格整理一个示例:某外卖平台用户在工作日晚高峰下单的概率是0.2。已知用户下单,则在15分钟内完成支付的概率是0.8;用户未下单,则在15分钟内产生支付行为的概率是0.05。现在随机抽到一位用户,发现他在15分钟内产生了支付行为,求他确实下单的概率。

设 A 表示“用户下单”,B 表示“用户在15分钟内支付”。题目给的是:

P(A) = 0.2 P(B|A) = 0.8 P(B|¬A) = 0.05

要求的 P(A|B) 用贝叶斯公式:

P(A|B) = P(B|A)P(A) / [P(B|A)P(A) + P(B|¬A)P(¬A)]

代入:

P(A|B) = 0.8×0.2 / (0.8×0.2 + 0.05×0.8) = 0.16 / 0.2 = 0.8

这题看似简单,但很多人会算成0.8直接填上去,也有人把分母写成 P(B) = 0.8×0.2 = 0.16。关键点在于“未下单但支付”的概率也要算进分母里。真实业务中这个数其实很重要,比如风控系统捕捉到支付行为,就要判断这个支付是不是真的由真实订单产生。

我的建议是不要死记公式,画一棵概率树,把“下单/未下单”和“支付/未支付”的分支全部画出来,再对照题目条件往里填数字,一般就不会出错了。

3.2 期望、方差与常见分布的结合题

美团这套题还喜欢把期望方差和业务场景放在一起考。比如“配送时间服从某个分布,求平均配送时间的期望”、“某补贴策略的成本波动如何量化”等。本质就是离散型随机变量和连续型随机变量的期望计算。

离散型随机变量期望的核心公式是 E[X] = Σ x·P(X=x),连续型则要积分。常见分布的期望和方差一定要形成条件反射:二项分布 B(n,p) 期望 np、方差 np(1-p);泊松分布的期望和方差都等于 λ;均匀分布的期望是区间中点;正态分布的期望 μ、方差 σ²。

我见过不少候选人把泊松分布和二项分布搞混,一看到“每小时的订单数”就写泊松。其实泊松分布适合描述单位时间内随机事件发生的次数,而二项分布适合描述固定 n 次试验中成功次数。如果题目给你的是“某个骑手接单后,每单超时的概率是0.1,求5单中恰好2单超时的概率”,那就是二项分布而不是泊松分布。

3.3 矩阵运算与最优化基础

数学模块里,矩阵运算和凸优化也是高频考点。美团这套真题的推导题通常不会超过“矩阵求导、梯度、海森矩阵”这个范围,但会暗中考察你对“可导、凸性、极值”这些概念的理解。

一个常见的记忆要点是判断函数是否为凸函数:对于可二次微分的函数,可以看海森矩阵是否半正定。在机器学习里,如果目标函数是凸函数,那么局部最优解就是全局最优解,这保证了梯度下降能找到最优解。这是为什么线性回归、逻辑回归、岭回归的优化很方便,而神经网络目标函数往往非凸,只能找局部最优的原因。

线性代数里还有一个必考的点是矩阵的秩。比如给定一个样本矩阵 X,问 X^T X 什么时候可逆。答案是当 X 列满秩的时候。如果列数大于行数,X^T X 一定不可逆,这时候就要靠正则化来解决。这个问题和之前岭回归那道题是连在一起的,2017年美团的出题风格就是这样,模块之间互相呼应。

4. 数据结构与算法编程题:笔试现场的硬仗

4.1 编程题的选材风格

美团2017秋招笔试的编程题,整体难度介于剑指Offer和LeetCode Medium之间,不考偏题怪题,重点看两点:一是编码基本功,二是在时间压力下能否写出无bug的代码。和ACM竞赛题不一样,这里的题目通常都带一点业务背景,比如“外卖订单按时间排序”、“骑手路径去重”、“推荐结果的TopN输出”等,但核心还是经典算法。

从题目类型上看,字符串处理、数组、链表、树、动态规划、二分查找、贪心是出现频率最高的几个方向。深搜广搜也偶尔出现,但一般不会考到特别复杂的剪枝。我记得当年同批考的人里,很多是在动态规划那一道上栽了跟头,因为DP题一眼看不出状态定义,就容易卡住。

4.2 高频题型与解题套路

我直接给一版整理好的优先级清单,照着刷能覆盖大部分题目:

  • 字符串类:最长公共子串、最长公共子序列、字符串去重、正则匹配简化版、反转字符串。这类题优先想双指针和动态规划。
  • 数组类:TopK问题、合并两个有序数组、旋转数组找最小值、连续子数组最大和。优先想堆、双指针、前缀和。
  • 链表类:反转链表、判断链表是否有环、合并两个有序链表、找倒数第K个节点。这类题推荐画图理解,代码量不大但容易写错指针。
  • 树类:二叉树层序遍历、前序中序恢复二叉树、最近公共祖先。优先掌握递归和队列。
  • 动态规划:爬楼梯、背包问题、最长递增子序列、编辑距离。先想清楚状态定义,再想状态转移。
  • 二分查找:有序数组查找、查找第一个不小于目标值的位置。重点练右边界到底取 left 还是 left+1。
  • 贪心:区间调度、分发饼干、跳跃游戏。这类题代码短,但证明贪心策略有效的思考过程容易被忽略。

我不建议搞题海战术,也不建议只刷Hard题。美团这套真题更看重你对经典题型的熟练度,刷透上面这些方向,比刷200道不成体系的题有用得多。

4.3 一道高频编程题的手写实现

我把当年感受最深的一个类型“最长不含重复字符的子串”整理成今天笔试也能直接用的标准解法。题目是:给定一个字符串 s,请找出其中不含有重复字符的最长子串的长度。

这是典型的滑动窗口题,维护窗口左右指针 left 和 right,用一个哈希集合记录窗口内的字符。每次右指针向右扩展,如果遇到重复字符,就移动左指针直到重复字符被移出窗口,然后更新答案。

def length_of_longest_substring(s: str) -> int: char_set = set() left = 0 max_len = 0 for right in range(len(s)): while s[right] in char_set: char_set.remove(s[left]) left += 1 char_set.add(s[right]) max_len = max(max_len, right - left + 1) return max_len

这段代码的时间复杂度是 O(n),因为每个字符最多被加入和移出集合各一次。空间复杂度是 O(min(n, m)),m 是字符集大小。

这道题很多人第一次写会踩两个坑:一个是在 while 循环里直接把 s[right] 从集合里删掉,结果漏删了 left 到重复位置之间的其他字符;另一个是忘记在窗口移动时同步更新最大长度。所以我在写代码的时候会先在注释里标清楚窗口的维护逻辑,再动手写,这样现场不容易乱。

4.4 笔试环境下的时间分配建议

关于这套真题的实战节奏,我给一个自己的经验值。假设笔试总共两小时,20道选择题加3道编程题加1道简答题,那么选择题建议控制在40分钟以内,因为选择题大多考概念,会就会,不会也不要恋战。简答题留20到30分钟,编程题留50到60分钟。

编程题千万不要按题目顺序做,先把三道题都扫一遍,从“最有把握”的那道开始写。如果某道题卡了15分钟没有思路,马上换下一道,把能拿的分先拿到。笔试最可惜的不是不会做,而是会做但没时间写。我当年认识的一个同学就是在一道DP上硬磕了40分钟,结果最简单的字符串题反而来不及写。

另外,写代码前先花两三分钟在草稿纸上写伪代码或者画用例,真的不是浪费时间。尤其是动态规划和双指针这类题,先把状态转移或者窗口变化的过程在纸上走一遍,提交的代码明显更稳。代码写完后,要留出时间自己构造两个测试用例,一个正常情况、一个边界情况,跑一遍看输出对不对。边界情况最容易翻车,比如空字符串、只有一个元素、全是重复字符等。

5. 业务场景题:算法工程师和“做题家”的分水岭

5.1 为什么算法笔试会考业务题

很多候选人看到业务场景题会愣住,觉得“我算法题都刷不过来了,还考业务?”但美团这套真题偏偏就有这样的题。原因很简单:算法工程师不是参加竞赛的选手,是要解决业务问题的工程师。你能不能在拿到一个模糊业务问题后,拆成清晰的技术方案,这是岗位的核心能力。

业务场景题通常不要求你写完整代码,而是考察你的逻辑是否完整。例如给你一个外卖配送调度的场景,问你怎么降低平均配送时长。这时候如果你的回答是“用强化学习”“用深度学习预测”,那基本就挂了。出题人想看到的不是模型名词,而是你能不能把问题进行结构化拆解。

5.2 一个外卖配送调度场景题的答题框架

我把2017年这轮题目里经常出现的配送调度题,整理成一个标准答题框架,你可以直接套用。

先定义目标:平均配送时长由“取餐等待时间 + 在途骑行时间 + 用户等待时间”组成。降低平均配送时长,本质上是在优化这几个环节。

再捋清约束:骑手数量有限,骑手有最大并行订单数,商家出餐时间不确定,用户地址分布不均匀,每个订单有预计送达时间要求。这些约束决定了你不可能单纯追求“全局最短路径”,必须同时考虑骑手时间窗和订单紧急程度。

然后是方案设计,通常有三个层次:

  • 第一层是订单分配:给新订单匹配一个最适合的骑手,可以建立“每个骑手当前空闲时间和已有配送路线”的画像,用贪心或匈牙利算法做匹配。
  • 第二层是路径规划:骑手一次带多单时的取送顺序,可以用TSP或改进的插入启发式算法,把新增订单插入到已有路线中使绕路距离最小。
  • 第三层是出餐联动:和商家打通出餐时间预测,提前调度骑手到店,而不是被动等骑手到了再等餐。

最后是评估指标:不能只盯平均配送时长,还要看超时率、骑手空驶率、单均成本。因为如果为了追求平均时长而给每个订单单独派一个骑手,成本会爆掉,这在实际业务里是不可接受的。

这个框架的要点是:先目标,再约束,再方案,再指标。按这个顺序答,哪怕方案不是最优,也能让阅卷人感受到你有完整的建模能力。

5.3 推荐系统场景题的通用模板

另一类常考的业务题是推荐场景。比如“如何给新用户做冷启动推荐”、“如何评估一个新的排序模型上线后的效果”。

我做题的时候会固定用这个模板:先定义用户与物品,再定义行为反馈,然后拆特征、选模型、定指标。

定义用户与物品:用户维度包括地理位置、历史行为、设备、时段偏好;物品维度包括类别、价格、销量、质量分、供给状态。这一步看起来废话,但能让你后面不慌。

定义行为反馈:在O2O场景里,点击、下单、支付、复购的权重完全不同。推荐系统的目标不是点击率最高,而是成交额或者订单量最大,所以要明确优化目标到底是用点击率、转化率还是GMV。

特征这一层,重点说清楚冷启动怎么处理。新用户没有历史行为,只能用位置、设备、时段这类上下文特征;新商品没有点击数据,可以用商家相似度、品类热度、图文信息来补。如果回答里提到“用内容特征和统计特征分层补充”,会比笼统地说“用协同过滤”高一个档次。

模型选型上,当时的主流是LR+GBDT的组合,也可以提到FM、FFM处理稀疏特征。关键是讲清楚为什么选这个模型:样本量、稀疏性、可解释性、线上延迟。最后用离线AUC、线上AB实验的转化率提升作为评估指标,并说明指标统计显著性怎么判断。这样一套答下来,业务题的分数基本稳了。

6. 备考策略与踩坑实录

6.1 按知识点优先级安排复习

如果现在距离笔试还有一个月,复习顺序一定要有取舍。我基于美团2017秋招真题-算法工程师A的知识分布,给一个相对的优先级排序:机器学习基础概念和公式推导排首位,因为选择、简答、业务题都会涉及;概率统计和线性代数紧随其后,因为计算题占分稳定;编程能力排在第三,每天保持2到3道经典题的手写;业务建模思维放在最后,但考前至少要看5个典型场景案例。

千万不要在第一周就陷入“SVM完整推导 + 各种聚类算法细节”的深坑。笔试考的是广度加重点深度,不是冷门知识竞赛。我见过太多人花一周时间研究各种正则化变体,结果一考最常见的梯度推导反而写不出来。

6.2 现场考试的8个实操细节

这些都是我自己和周围人踩过的坑,整理出来给你提个醒:

  • 先做会做的题,顺序可以打乱,但一定要在答题卡或编辑器上标注清楚题号。
  • 选择题遇到不确定的,先跳过,最后有时间再回来蒙一个,不要空着。
  • 公式推导题,先把已知条件和求解目标抄在草稿纸上,不要上来就写。
  • 概率题画概率树或韦恩图,能大幅降低条件概率方向搞反的概率。
  • 编程题先写边界判断,例如空输入、长度1、负数场景,再写主体逻辑。
  • 时间复杂度过高时,先暂停代码写一个暴力的正确版本,拿部分分比没分强。
  • 业务场景题如果时间不够,写一个“目标-约束-方案-指标”的骨架,也能拿到一半以上的分。
  • 全程不要慌张看别人,笔试是个人战,你的节奏比什么都重要。

6.3 今天再回看这套真题,我的几个体会

整理这篇题目复盘的过程中,我把当年的笔记又翻了一遍,有个感受特别明显:2017年这套题考的东西,在今天的算法工程师面试里不仅没有过时,反而成了公共基础。现在卷模型、卷论文、卷大模型微调,但面试官随手还是会问“偏差方差怎么权衡”“逻辑回归如何推导”这类问题。因为这些基础是算法工程师识别问题、设计方案的底层能力,和用什么框架、什么模型无关。

备考算法工程师笔试,不要把它当成一次突击考试,而是当成一次系统梳理知识体系的机会。你自己能徒手推导的公式、你对业务场景的拆解框架、你写过的每一道经典算法题,这些不会因为面试结束就归零,它们会在你入行后的真实工作中一遍遍回来找你。

如果这篇文章对你有帮助,建议把里面提到的几个自拟题动手做一遍,再把机器学习模型对比表自己填一遍。动手练和用眼睛看,效果差很多。祝你在接下来的秋招笔试里,稳稳拿下心仪的算法工程师岗位。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询