2025年准备算法岗面试的人,应该都有个共同感受:考的不再是单一知识点,而是“算法基础 + 工程判断 + 业务理解”三件事混在一起考。我复盘了不少美团算法/AI相关岗位的面经和真题,发现高频题目的脉络其实挺清晰的,从KMP的next数组、排序算法复杂度,到Transformer原理里的KL散度、搜索推荐里的多目标优化,再到Agent、RAG、AI编程这些新方向,全都被卷进了面试范围。这篇文章我就按自己的理解,把美团算法/AI岗的高频考点拆解开,结合真题和推导过程,说说每类题到底在考什么、怎么准备才不容易翻车。
先说个总体的判断:美团的算法岗面试,重基础但更重落地。手撕代码是入场券,机器学习/深度学习原理是分水岭,能不能把算法用在外卖、到店、搜索推荐这些真实业务里,决定了你能不能走到最后。下面我按考察维度逐块展开。
1. 美团算法/AI岗面试的考察底盘与岗位差异
1.1 面试流程里容易被低估的环节
多数算法岗的流程是:笔试 -> 技术一面 -> 技术二面 -> 交叉/业务面 -> HR面。笔试基本都是算法题,牛客网风格,2小时4道左右,难度介于LeetCode Medium和Hard之间。很多人把重心全放在刷题上,却低估了一面到二面之间的“基础原理追问”,这部分才是真正刷人的地方。
一面一般是一个资深工程师或技术专家,重点考查数据结构和算法基本功,偶尔会带一道简单的机器学习推导。二面往往是团队负责人或更高职级,问题会偏向系统设计、业务场景、模型选型和优化。三面交叉面则可能从工程视角出发,问你线上服务怎么设计、特征怎么管理、模型怎么评估。
我在复盘中发现一个高频现象:很多候选人在一面手撕代码表现不错,却在二面被“业务场景题”问倒。比如面试官会问“外卖ETA预估的特征有哪些?”“推荐系统冷启动怎么做?”“骑手路径规划和你刷过的TSP有什么关系?”这类问题没有标准答案,考的是你有没有把算法和业务连起来的意识。
1.2 算法工程师和AI工程师的考察权重差异
这里要区分两类岗位。美团内部既有做搜索、推荐、广告、定价、运筹优化的“算法工程师”,也有做大模型应用、Agent、多模态的“AI工程师”。两者在面试时的侧重点不太一样。
算法工程师更看重:数据结构与算法、机器学习基础(LR、GBDT、FM等)、业务场景中如何使用排序/召回/重排模型、特征工程和AB实验设计。AI工程师更看重:Transformer原理、大模型训练与推理优化、RAG流程、Agent架构、LoRA微调、AI编程工具链等。但两者都要考算法题,都躲不开手撕代码。
所以准备前先想清楚自己是投哪类岗位,精力分配完全不同。如果你硬着头皮两个方向都抓,很容易基础不牢、新知识也学不深。我认识一个朋友,准备时把大量时间花在Transformer和RLHF上,结果投的是搜索推荐方向的算法岗,面试官反复问GBDT和FM,最后挂在了二面。方向错位比能力不足更可惜。
2. 机器学习与深度学习方向的高频原题与推导要点
2.1 模型梯度推导、正则化这类“基本功”题
机器学习基础题在美团面试里几乎没有缺席过。最常出现的有:逻辑回归的损失函数和梯度推导、为什么分类用交叉熵而不用MSE、L1和L2正则化的区别、SVM的间隔与核函数、GBDT与XGBoost的区别、FM为何能解决稀疏特征组合问题。
先说说逻辑回归。很多背过八股的人能写出交叉熵公式,但被问到“为什么不用MSE”就卡住了。核心答案是:逻辑回归用sigmoid激活,如果损失函数用MSE,目标函数对于参数的梯度会包含sigmoid的导数项,在预测值接近0或1时梯度趋近于0,收敛极慢甚至陷入局部最优;而交叉熵与sigmoid组合后,梯度形式是(p - y) * x,没有饱和项,训练稳定得多。
L1和L2正则化的区别也是必问。L2是权重平方和加入损失函数,梯度下降时权重按比例缩小,所以权重趋近于0但不会等于0;L1是绝对值之和,它的梯度是常数符号,权重在0附近会有一个“压缩到正好0”的作用,因此L1能带来稀疏解,适合做特征选择。用一句话记:L2均匀地压缩,L1硬性地砍掉。
还有个高频衍生题:为什么XGBoost比GBDT好用?回答时抓住几个关键点就行:XGBoost对目标函数做了二阶泰勒展开,比GBDT只用一阶梯度信息更精确;内置了正则项控制模型复杂度;对缺失值有自动学习分叉方向的处理;支持并行建树。面试官追问时,一般还会让你解释“二阶信息为什么更好”,你可以用牛顿法和梯度下降法做类比:梯度下降只用了当前梯度,牛顿法还用了二阶曲率信息,步长和方向都更合理。
2.2 从KL散度到Transformer:原理题的多轮追问套路
2025年的面试里,Transformer已经是默认基础了。围绕它的追问能连续问三层:什么是自注意力、为什么要除以sqrt(d_k)、位置编码为什么用正弦函数。但在这之前,面试官经常先用一个概念题热场:KL散度。
KL散度衡量的是两个分布之间的差异,公式是KL(P||Q) = sum(P(x) * log(P(x)/Q(x)))。它有个特性:不对称,KL(P||Q)不等于KL(Q||P)。这经常在模型蒸馏、VAE、RLHF的KL惩罚里出现。面试里可能会让你解释“为什么RLHF要加KL约束”,答案是为了防止模型在优化奖励时偏离原始SFT模型太远,KL项就是在限制两者分布差异。
Transformer里最经典的问题链是这样的:先让你写出self-attention的公式,Attention(Q,K,V) = softmax(QK^T/sqrt(d_k))V,然后问为什么要除以sqrt(d_k)。原因是点积的方差随维度增大而增大,如果不缩放,softmax的输入会集中在梯度极小的区域,导致梯度消失。除以sqrt(d_k)能把点积的值域拉回到合适范围。
位置编码的问题也常考。Transformer本身没有序列顺序信息,所以需要在输入中加入位置编码。正弦位置编码的好处是:可以处理训练时没见过的长度,且不同位置之间的相对位置可以通过线性变换近似表达。追问“为什么不用可学习的位置编码?”时,你可以说可学习编码在固定长度内没问题,但外推性不如正弦编码,不过现在很多大模型用的RoPE又是另一套思路,能更好地处理长文本。
2.3 手推优化:梯度下降、粒子群、模拟退火
美团面试里有个比较有特色的点:会考一些非深度学习的优化算法。这和它的业务有关,比如外卖路径规划、运力调度、定价策略都会涉及组合优化和启发式算法。最近的面经里,粒子群算法(PSO)、模拟退火(SA)、贪心算法、剪枝算法出现的频率都不低。
粒子群算法的核心就一个速度-位置更新公式:v = wv + c1r1*(pbest - x) + c2r2(gbest - x),x = x + v。其中w是惯性权重,pbest是粒子历史最优,gbest是全局最优。面试官可能会让你说说w大和小分别有什么影响:w大全局探索能力强,w小局部收敛更精细。实际使用时常做线性递减w,前期探索后期收敛。
模拟退火考的是Metropolis接受准则:如果新解更优,无条件接受;如果新解更差,以概率exp(-delta/T)接受。T是温度,随着迭代下降,所以算法前期容忍差解跳出局部最优,后期趋向稳定。这个思想在工程中的价值在于:很多组合优化问题没有精确解,启发式算法能给出足够好的可行解。
这里的准备方法是:不要只背公式,要能手推一次更新过程。比如面试官给出一个简单函数求最小值,让你用三步PSO演示粒子的位置和速度怎么变,你能不能算出来。说白了,这类题目考的是“你真的调过参数”还是“只看了博客”。
3. 数据结构与算法手撕题:KMP、排序、LRU到底在考什么
3.1 KMP与next数组:以"abacaba"为例的完整推导
手撕代码是美团算法岗面试的硬门槛。题源很广,但有一些题型几乎年年出现:KMP字符串匹配、LRU缓存设计、排序算法手写与复杂度分析、并查集、二分图匹配、动态规划背包类问题。
以KMP为例,最近流传较广的一道题是:对模式串 p = "abacaba",写出它的next数组。这题表面考记忆,实际考你是否理解next数组的本质——next[i]表示模式串前i个字符组成的子串中,最长相同前后缀的长度。
我手动推一遍。以“abacaba”为例,约定next[i]表示长度为i的前缀中最长相同前后缀长度,通常next[1]=0。
长度为1的前缀“a”,没有非空真前后缀可相等,next[1]=0。 长度为2的前缀“ab”,前后缀集合分别是“a”和“b”,不相等,next[2]=0。 长度为3的前缀“aba”,前缀集合有“a”“ab”,后缀集合有“a”“ba”,最长相等的是“a”,长度1,next[3]=1。 长度为4的前缀“abac”,前缀有“a”“ab”“aba”,后缀有“c”“ac”“bac”,无相等,next[4]=0。 长度为5的前缀“abaca”,前缀集合里有“a”“ab”“aba”“abac”,后缀里有“a”“ca”“aca”“baca”,最长相等的是“a”,next[5]=1。 长度为6的前缀“abacab”,前缀集合中有“ab”这一项,后缀集合中也有“ab”(末尾两位),next[6]=2。 长度为7的前缀“abacaba”,前缀集合中“aba”与后缀集合中“aba”(末尾三位)相等,所以next[7]=3。
最终next数组为[0, 0, 0, 1, 0, 1, 2, 3](从下标0到7)。面试时如果采用另一种定义,比如next[j]表示失配时跳转的位置,写出的数组可能是[-1, 0, 0, 0, 1, 0, 1, 2],你需要先跟面试官确认定义,再推导。这里最见功底的地方不在于背结果,而在于你能不能现场画一遍前缀表。
3.2 排序算法的复杂度、稳定性与工程选择
排序是另一类必考题,难点不是“会不会写快排”,而是能不能把复杂度、稳定性、应用场景说清楚。美团面试里常考一张表:
| 排序算法 | 平均时间复杂度 | 最坏时间复杂度 | 空间复杂度 | 稳定性 |
|---|---|---|---|---|
| 冒泡排序 | O(n^2) | O(n^2) | O(1) | 稳定 |
| 快速排序 | O(n log n) | O(n^2) | O(log n) | 不稳定 |
| 归并排序 | O(n log n) | O(n log n) | O(n) | 稳定 |
| 堆排序 | O(n log n) | O(n log n) | O(1) | 不稳定 |
面试官的追问通常有这几个:快排最坏情况是什么?(每次partition选的pivot都正好是最大或最小元素,导致极度不平衡)怎么避免?(随机选pivot、三数取中)归并排序为什么稳定?(合并时相同元素优先取左边数组)堆排序为什么不稳定?(堆调整过程中相同关键字的相对顺序可能被改变)。
还有一个工程向的追问:C++的std::sort底层是怎么实现的?答案是用内省排序introsort:快排为主,当递归深度超过阈值时切换为堆排序避免最坏O(n^2),当待排序区间较小时用插入排序利用其常数小的优势。这个问题考察的是“你会不会用排序解决真实问题”,而不只是背API。
3.3 高频结构设计题:LRU、并查集、二分图匹配
LRU缓存设计是美团面试里出现率极高的题。核心要求是get和put操作都是O(1)时间复杂度。实现方案是哈希表加双向链表:哈希表负责O(1)找到节点,双向链表负责O(1)删除和移动节点。每次get时把节点移到链表头部,put时如果容量满了就删除尾部节点。很多人在面试时直接用了LinkedHashMap,但面试官其实更想看到你手写一个双向链表结构,理解指针怎么维护。想拿高分的话,你可以提一下多线程环境下如何加锁、为什么用synchronized分桶锁或读写锁、Redis的近似LRU和严格LRU的差别。
并查集也是高频考点。它能高效处理动态连通性问题,比如判断两个节点是否在同一个集合、合并两个集合。关键优化有两个:路径压缩和按秩合并。路径压缩让find操作几乎达到O(1)均摊复杂度;按秩合并让树的高度始终保持在对数级别。面试中常见应用是岛屿数量、朋友圈数量、判断图中是否存在冗余连接。
二分图匹配如果考到,多半会问你两种算法的取舍:匈牙利算法复杂度O(VE),Hopcroft-Karp(HK算法)能优化到O(Esqrt(V))。HK算法的核心是用BFS分层找多条增广路,再用DFS同时增广。面试官一般不要求你完整手写HK,但会希望你说清楚它比匈牙利快在哪里、适用场景是什么。
4. 业务场景算法:从外卖调度到多目标优化
4.1 策略类算法题为什么考PID、MPPT这类控制算法
你可能觉得奇怪:算法/AI岗面试怎么还会问PID算法、MPPT算法、FOC算法?我翻了不少面经后发现,这类提问往往出现在有硬件、机器人、自动驾驶、智能设备业务线的团队面试中。比如美团有无人配送、智能仓储、智慧餐厅相关的业务,就会涉及运动控制和电源管理知识。
PID三个环节的作用必须能讲清楚:P(比例)根据当前误差输出,反应快但有稳态误差;I(积分)累积历史误差消除稳态误差,但积分过大会导致超调;D(微分)根据误差变化趋势提前抑制,减少超调但会对噪声敏感。面试官会让你举一个调参例子,比如温度控制系统:P太大温度振荡,加D可以压住振荡,但发现还是有一点稳态误差,再加I消除。
MPPT是光伏发电里的最大功率点追踪算法,常见方法有扰动观察法和电导增量法。扰动观察法的思路是:给工作电压一个小的扰动,如果功率变大就继续同方向扰动,如果变小就反向扰动。它实现简单但会在最大功率点附近振荡;电导增量法根据dP/dV的符号判断当前工作在曲线左侧还是右侧,精度更高。这类题目如果没接触过,其实很难现场编,准备时重点是把“为什么需要这类算法”理解到位:外部环境一直变,系统必须动态调整参数去追最优工作点。
4.2 规则引擎与Rete匹配算法在业务系统中的实际用途
另一个比较冷门但会在工程面里出现的题,是关于Drools规则引擎和Rete算法的。为什么美团这类业务会问这个?因为订单风控、优惠券发放、履约策略里大量用到规则引擎。当规则数量庞大、事实对象多时,朴素地逐条判断每条规则是否匹配,计算开销会非常惊人。Rete算法的核心就是通过构建alpha网络和beta网络,把规则的匹配结果缓存起来,只在事实发生变化时增量更新匹配状态。
面试时你不需要背Rete的全部细节,但要知道它的两个核心思想:一是共享条件判断,多个规则中有相同的模式时只计算一次;二是状态保存,事实变化时只更新受影响的部分。面试官可能会结合一个实际案例问你:“外卖订单的风控规则有几百条,每条规则涉及订单金额、用户历史、店铺评分等多个事实,你怎么设计规则匹配系统?”这时候你能说出用Rete思想做模式共享和增量匹配,就已经比大多数人强了。
4.3 外卖/搜索/推荐场景的取舍思维
美团算法岗的业务场景题,多数围绕外卖、到店、搜索、推荐、广告展开。常见问题有这么几类:外卖ETA(预计送达时间)怎么做?推荐系统冷启动怎么解?平台补贴怎么分配才能既拉单量又控成本?多目标排序怎么权衡?
以“外卖ETA”为例,算法工程师要综合考虑出餐时间、骑手取餐时间、路程骑行时间、等餐时间、用户所在楼宇的电梯等待时间。这里面既有时序预测(出餐时长)、地理空间计算(骑行路径)、又有动态变化(高峰期运力紧张)。面试时你说出“用GBDT或深度学习模型预测,但更重要的是特征工程”是不够的,最好能列出具体特征:店铺历史出餐时长、订单时段、天气、骑手实时位置、楼宇电梯平均等待时间、同时段同类订单平均时长等。
推荐里的多目标优化也特别常考。推荐系统不能只看点击率,还要看转化率、完单率、客单价和骑手运力约束。常用的做法是分层架构:粗排用轻量模型做候选召回,精排用MMoE这类多任务模型同时建模多个目标,最后在重排阶段用规则或组合优化处理业务约束。“多目标怎么权衡”的答案是:不要试图把它变成单目标,而是用一个可调节的超参做加权打分,线上通过AB实验调参。你要能说出帕累托最优的概念,并且理解“负向指标约束下优化正向指标”的工程思路。
5. 大模型与Agent方向的新考法:RAG、RLHF、AI编程
5.1 大模型面试的必答三问
如果你投AI相关岗位,大模型部分几乎是必考。我梳理下来,出镜率最高的是这三个问题:RLHF的训练流程是什么?RAG和微调怎么选?LoRA为什么能省资源。
RLHF的回答分三步:先做监督微调SFT,让模型具备基本的指令跟随能力;再训练奖励模型,用人类标注的偏好数据学习“哪个回答更好”;最后用强化学习(常见是PPO)让模型在最大化奖励的同时,加上KL散度约束,避免偏离原始SFT模型太远。追问一般会落在“为什么不用直接回归训练损失”上,答案是奖励模型是人类偏好的代理,直接回归很难建模偏好的序关系,而强化学习天然适合优化不可导的奖励目标。
RAG和微调的选型问题,回答框架是:知识更新频繁、依赖外部事实、需要引用来源时优先RAG;模型行为风格需要改变、任务模式稳定时优先微调。RAG的离线和在线架构要能说清楚:离线阶段做文档解析、切分、向量化;在线阶段对用户query向量化,召回TopK文档,重排后拼进prompt。面试官再追问,会问“RAG效果怎么评估”,拆成检索质量和生成质量两部分:检索看召回率、命中率、重排NDCG;生成看答案忠实度、相关性和完整性。
5.2 Agent的考法:ReAct、记忆、工具调用
2025年AI岗位面试里,Agent相关问题的频率明显上升。面经里经常出现“请说明Agent的核心架构”和“如何让Agent完成一个多步骤任务”。常见框架是ReAct模式,即推理和行动交替:模型先分析当前状态,决定下一步动作,调用工具,根据工具结果继续推理,直到任务完成。这背后的价值是,大模型不能只靠参数里的知识完成任务,还要能主动获取外部信息、操作外部工具。
面试官会问“Agent的记忆怎么做”。这里要区分短期记忆和长期记忆:短期记忆是当前对话上下文,通常受限于窗口长度;长期记忆是把关键信息写入向量数据库,下次任务时检索调用。工具调用则要讲清楚Function Calling的流程:预先定义好函数的schema,模型输出结构化调用意图,程序执行真实函数,把结果返回给模型继续推理。
准备方向是:自己动手跑一个简单的Agent项目,比如用LangGraph或向量数据库搭一个能查天气、查数据库的小Agent。面试中能把项目里的一个失败案例讲清楚,比背十个框架名词管用得多。
5.3 AI编程工具在面试里的双刃剑
“AI编程提示词”“Cursor AI编程”是近期的热词,但面试对AI编程的态度是既接受又警惕。一方面,很多面试环节已经允许使用AI辅助工具,甚至面试官会问你“平时用AI编程吗,它改变了你的工作流吗”;另一方面,如果手撕代码时过度依赖AI工具,连基础的KMP、快排都写不利索,面试官会直接判定基础不牢。
我在复盘面经时发现一个趋势:面试官现在更喜欢问“你如何审视力AI生成的代码”。比如让AI写一个并发安全的LRU缓存,它可能给出synchronized关键字,但你还是得指出细粒度锁的优化空间。再比如AI生成一段排序代码,你需要补上对空数组、重复元素的边界测试。这个环节没有题库可刷,靠的是平时真正用AI工具写代码,然后主动做code review。
6. 备考节奏和现场发挥的一些实际经验
6.1 三个月规划怎么排
如果准备周期是三个月,我的建议是:第一个月主攻数据结构和算法,LeetCode按题型刷,数组、链表、树、图、动态规划各挑高频题,每天2-3道新题加复盘旧题,重点把手撕能力练稳定;第二个月把机器学习、深度学习基础过一遍,每个模型的推导都亲手走一遍;第三个月专门攻业务场景题和大模型/AI方向的新考点,同时持续刷题保持手感。
很多人容易犯的错是刷题刷到最后一刻,原理题却没时间准备。实际上,美团面试中原理题和场景题的分量一点都不比算法题轻。准备原理题的有效方法不是看书,而是“自己给自己讲课”:打开一个空白文档,把逻辑回归的梯度推导、Transformer的注意力计算、Rete算法的匹配过程写出来,写不出来就说明还没掌握。
6.2 面试现场的答题语言和复盘方法
面试时有个小技巧:先复述题目,再给思路,再动手写。不管题目是算法题还是场景题,先说清楚你对问题的理解,既能确认自己没理解偏,又给自己争取了思考时间。写代码时先写核心逻辑,把边界条件放在最后补,别一上来就纠结空指针。
复盘比刷新题更重要。每次面完把被追问卡住的问题记下来,按“题目、我当时怎么答的、正确思路、漏掉的点”四个字段整理。我见过一个准备很认真的博主,用这个方法把面经里的每个问题整理成了几百条笔记,最后拿到多个offer。你也可以试试:每次模拟面试结束后,把过程中所有的追问都记录下来,因为追问往往才是区分候选人的关键。
最后分享一个我自己感受很深的事:算法/AI面试,本质上不是考你会不会背题,而是考你有没有真正理解算法在解决什么问题。KMP的next数组背下来不难,但如果你理解它是在“利用已匹配部分的信息避免重复匹配”,就算题目换个模式串你也能现场推出来。粒子群算法公式不复杂,但你说不出它和梯度下降的本质区别——一个利用群体信息探索,一个利用梯度信息收敛——面试官就会觉得你只是背了八股。所以我的建议是,每准备一个知识点,都多问自己一句:这个算法解决的是什么问题?它为什么这样设计?换一个场景我还能用它吗?想明白这三件事,面试时你会自然从容很多。