美团算法策略岗笔试复盘:题解、考点与备考策略(含代码)

📅 发布时间:2026/8/30 20:36:03
美团算法策略岗笔试复盘:题解、考点与备考策略(含代码) 先说结论美团算法策略岗的笔试不是单纯考算法而是在考“你脑子里有没有一套能落地的策略建模思维”。如果你按普通后端开发岗的思路去刷题大概率能做对一两道但会在某些看起来很“偏”的题目上栽跟头。我参加的是2024年春招第一批笔试牛客网平台两个小时四道编程题加若干行测和专业选择题整体体验下来题目难度分布大致是两道力扣中等、一道中等偏上、一道困难。这篇文章不打算复述题目原文而是把我记忆里还原度较高的四道题、我的解题过程、以及考完之后的复盘思考完整写下来给后面准备美团算法策略岗的同学一个真实参考。先说一个总的感受美团这批笔试题非常看重“问题建模”这一步。很多题如果你直接按暴力去做不是超时就是内存爆掉但你一旦把抽象的业务场景转化成某个经典算法模型解法会非常清晰。这其实就是在模拟算法策略岗位的日常——业务给你的从来不是干净的算法题而是一堆模糊的需求你的价值恰恰在于把它转换成可计算的问题。1. 整体情况题型分布、时间分配和平台体验1.1 笔试题型构成与分值占比2024年春招美团算法策略岗的第一批笔试时长是120分钟平台用的是牛客网。题型分两大块第一部分是选择题大约30道左右每题分值不高但覆盖面很广包括行测类型的逻辑推理题、数学计算题以及计算机基础题数据结构、操作系统、网络、数据库和少量机器学习/算法理论基础题。第二部分是四道编程题这是大头占分比例接近70%到80%。需要特别提醒的是这里的选择题里会出现一些非常规的算法名词比如粒子群算法、模拟退火算法、卡尔曼滤波这类启发式搜索和状态估计算法。我考前没有专门准备这部分考场上遇到粒子群算法的原理题有点懵但靠排除法也能蒙对几个。后面我会专门分析这些算法到底要不要花时间准备。1.2 我这120分钟是怎么分配的我个人的节奏是前40分钟做选择题遇到拿不准的直接标记跳过绝不恋战。剩下80分钟做四道编程题其中前两道题花了25分钟左右第三道题花了20分钟第四道题花了30分钟最后留了5分钟检查输入输出格式和边界条件。这个节奏有一个坑牛客网的编程题是ACM模式不是力扣那种核心代码模式。也就是说你需要自己处理输入输出包括循环读入、按行解析、处理字符串分隔符等。如果你平时只在力扣上刷题不熟悉这个模式很容易在前两道简单题上浪费大量时间在输入输出解析上。我建议考前至少花一晚上专门练习牛客网或赛码网上的ACM模式题目把所有常用的输入输出写法都背下来。1.3 平台环境的几个细节牛客网的在线编辑器没有代码自动补全所以STL常用接口最好背熟比如priority_queue的第三个模板参数、unordered_map的用法、string::find_first_of这种冷门接口。提交后立刻能看到这道题的通过率反馈是编译错误、部分通过还是全部通过但不会告诉你具体哪些测试用例没过。支持的语言很全C、Java、Python都可以我选的是C因为算法竞赛中C的STL和速度优势在笔试阶段最稳。如果一道题只过了部分用例会显示“通过部分测试用例”这种情况下是能拿到一部分分数的所以不要因为没完全解出来就放弃提交暴力解法能过多少算多少。2. 四道编程题的完整复盘从题目还原到解题思路2.1 第一题骑手取餐顺序优化贪心 优先队列这道题的场景很贴近美团外卖的真实业务。描述大概是有若干个订单每个订单有一个取餐时间点和一个送餐耗时。骑手一次只能取一份餐取餐和送餐都不能并行问怎样安排取餐顺序能让所有订单的总完成时间最小。这个题我一看就觉得可以做因为它本质上是“任务调度最小化总完成时间”的经典模型。我们需要定义清楚每个订单的完成时间 骑手到达餐厅开始取餐到最终送达的时间点。骑手可以提前到达餐厅等着也可以先取别的订单。约束是同一个时间只能处理一个订单的一个阶段。我当时想到的思路是先把订单按取餐时间排序然后维护一个以送餐耗时降序排列的优先队列。遍历时间轴每当到达某个时间点就把所有已可以取餐的订单放入队列然后取当前送餐耗时最长的订单先送。这里用优先队列保证局部最优因为送餐耗时长的订单拖到后面会让整体完成时间膨胀得更严重。核心代码如下C#include bits/stdc.h using namespace std; struct Order { long long pickupTime; long long deliveryTime; }; int main() { int n; cin n; vectorOrder orders(n); for (int i 0; i n; i) { cin orders[i].pickupTime orders[i].deliveryTime; } sort(orders.begin(), orders.end(), [](const Order a, const Order b) { return a.pickupTime b.pickupTime; }); priority_queuepairlong long, long long pq; long long idx 0; long long now 0; long long ans 0; while (idx n || !pq.empty()) { if (pq.empty() now orders[idx].pickupTime) { now orders[idx].pickupTime; } while (idx n orders[idx].pickupTime now) { pq.push({orders[idx].deliveryTime, idx}); idx; } auto [deliveryTime, orderIdx] pq.top(); pq.pop(); now deliveryTime; ans now; } cout ans endl; return 0; }这里的关键点是now变量表示骑手的当前空闲时间。如果队列为空但下一个订单还没到取餐时间就把now直接跳到下一个订单的取餐时间这一步处理了“骑手空转等待”的时间。复杂度是O(n log n)能过。考后复盘这道题其实有更严格的证明思路就是交换论证法。假设当前有两个订单A和B送餐耗时分别是a和b如果先送A再送B总贡献时间是2ab如果先送B再送A总贡献时间是2ba。当ab时前者更优所以送餐耗时长的应该先送。这个逻辑和操作系统里的SJF短作业优先调度的精神是相反的但内核是相同的——让最重的任务先完成。2.2 第二题众包骑手覆盖区间合并差分数组 离散化第二题的场景也很业务化。大意是多个众包骑手在某段时间内上线接单每个骑手上线的时间段是一个闭区间给定多个骑手的时间区间问哪些时间点有超过K个骑手同时在线。这个题如果你只会遍历每个时间点大概率超时因为时间点的范围可能到10^9级别。但它其实是一个非常典型的区间计数问题解法是差分数组。差分数组的核心思路是区间[l, r]加1不直接对区间内每个点操作而是在diff[l] 1diff[r1] - 1最后做一次前缀和就能还原出每个点的值。处理大范围时间点时需要用哈希表或离散化把区间端点压缩成可计算的索引。我当时直接用了maplong long, long long存储差分因为C的map是有序的遍历时按键从小到大累加就能得到每个关键时间点的骑手数量。代码如下#include bits/stdc.h using namespace std; int main() { int n, K; cin n K; maplong long, long long diff; for (int i 0; i n; i) { long long l, r; cin l r; diff[l] 1; diff[r 1] - 1; } long long cur 0; long long ansStart -1; long long ansEnd -1; long long total 0; for (auto [pos, delta] : diff) { long long prev cur; cur delta; if (prev K cur K) { // 连续存在结束时间持续到当前pos } else if (prev K cur K) { // 区间结束 } else if (prev K cur K) { // 新区间开始 ansStart pos; } // 统计总长度 if (prev K) { total pos - lastPos; } lastPos pos; } cout total endl; return 0; }简化后的代码可以统计所有满足条件的总时长这里我把区间合并和长度统计都做了进去。实际笔试题可能只要求输出区间总数那就更简单了只要在prev K cur K时计数加一即可。考后复盘差分数组是一个被严重低估的考点。美团这种有大量“时间段”业务场景的公司几乎每年笔试都会出一道差分类的题可能包装成“骑手在线时长覆盖”“波峰波谷统计”“多个任务的公共空闲段”等。特别是区间离散化这个技巧一定要熟练。2.3 第三题模式串匹配数量统计KMP算法应用第三题描述大概是这样给定一个主字符串S和一个模式串P统计P在S中出现的所有位置而且要求统计时不能重叠。注意它要求的是“不重叠匹配”的个数也就是说匹配之后要跳过整个模式串的长度继续向后搜索而不是从下一个字符开始。很多熟悉KMP的同学第一反应是直接套板子但这题容易漏掉的细节就是不重叠。标准的KMP在找到一次匹配后回退到next数组中下一个可能匹配的位置这个位置有可能和上一次匹配重叠所以需要额外判断。我当时先写了KMP的next数组计算再在主串匹配时做了重叠判断#include bits/stdc.h using namespace std; vectorint computeNext(const string p) { int m p.size(); vectorint next(m 1, 0); int j 0; for (int i 2; i m; i) { while (j 0 p[i - 1] ! p[j]) { j next[j]; } if (p[i - 1] p[j]) j; next[i] j; } return next; } int main() { string s, p; cin s p; vectorint next computeNext(p); int n s.size(), m p.size(); int j 0; int ans 0; int lastMatchEnd -1; for (int i 0; i n; i) { while (j 0 s[i] ! p[j]) { j next[j]; } if (s[i] p[j]) j; if (j m) { int matchStart i - m 1; if (matchStart lastMatchEnd) { ans; lastMatchEnd i 1; } j next[j]; } } cout ans endl; return 0; }这里lastMatchEnd记录上一次匹配的结束位置当新匹配的起始位置小于等于该值时说明和上一次匹配重叠了不算新的一次。这个判断很关键因为它把“统计不重叠子串”这个额外需求精确表达了出来。考后复盘KMP的next数组有两种定义一种是next[i]表示“模式串前i个字符的最长相等前后缀长度”另一种是next[i]表示“失配时跳转到的下标”。这两种定义下代码会有差异笔试现场如果背混了写出来的程序会非常隐蔽地出错可能在很多用例上都能过但某个边界会挂。建议考前把一种定义彻底吃透并亲手推导一遍而不是只背代码。另外这一题如果用的是字符串哈希方案也能做而且写起来更快二分哈希求LCP或者直接算哈希值比较但哈希有概率冲突。虽然笔试的数据一般不会故意卡哈希冲突但KMP这种确定性解法更稳妥而且面试官也可能追问KMP的next数组原理所以宁可多写几行代码。2.4 第四题带状态约束的最短路Dijkstra 分层图状态压缩第四题是最难的一道也是最像“策略”的一道。描述大概是在一个城市地图中有N个路口和M条道路每条道路有一个通行时间。骑手从起点出发到终点中间有若干个“优惠券点”每经过一个优惠券点可以减免某条路径的通行时间但每个优惠券点只能用一次而且使用优惠券有顺序要求比如必须先使用一种类型的优惠券才能使用另一种。问从起点到终点的最短通行时间是多少。这个题一看就是“带状态约束的最短路”。直接跑Dijkstra不行因为你不能简单地把节点看成路口得把“已经使用了哪些优惠券”这个状态也纳入到最短路的维度里。我当时采用的做法是分层图状态压缩。把“优惠券使用情况”压缩成一个二进制掩码每一位表示某种类型的优惠券是否已经使用过。这样从单源点出发扩展到(当前路口, 当前掩码)这个状态相当于构造了一个N * (2^k)规模的图其中k是优惠券类型的数量。实际数据范围里k一般不会超过10所以状态数是可以接受的。核心结构如下struct State { int node; int mask; long long dist; bool operator(const State other) const { return dist other.dist; } };Dijkstra更新时不仅要更新“到下一路口的距离”还需要更新“如果使用某张可用优惠券并满足顺序条件则距离可以更短”的状态。这里的核心转移是对于当前路口u枚举它的每一条出边v如果当前掩码满足某种优惠券的使用条件可以尝试使用那张优惠券将mask的第i位设置为1同时距离按优惠后的费用计算。关键代码如下伪代码级priority_queueState, vectorState, greaterState pq; vectorvectorlong long dist(N, vectorlong long(1 k, INF)); dist[start][0] 0; pq.push({start, 0, 0}); while (!pq.empty()) { State top pq.top(); pq.pop(); if (top.dist dist[top.node][top.mask]) continue; for (auto [nxt, w] : adj[top.node]) { // 不使用优惠券的转移 if (dist[nxt][top.mask] top.dist w) { dist[nxt][top.mask] top.dist w; pq.push({nxt, top.mask, dist[nxt][top.mask]}); } // 使用某种优惠券的转移 for (int i 0; i k; i) { if ((top.mask (1 i))) continue; if (canUseCoupon[i][top.node][nxt]) { int newMask top.mask | (1 i); long long newDist top.dist (long long)(w * discount[i]); if (dist[nxt][newMask] newDist) { dist[nxt][newMask] newDist; pq.push({nxt, newMask, newDist}); } } } } }最终答案就是min(dist[end][mask])遍历所有掩码取最小值。我在这道题上大概花了30分钟代码写完后发现一个bug状态更新时没有判断优惠券的使用顺序条件导致部分用例不正确。由于时间原因我没有完全修好只提交了暴力版本大概过了30%左右的测试用例。这道题是整场笔试里我失分最严重的地方。考后复盘分层图最短路是美团笔试很喜欢出的进阶题型本质上是把“选择”这个维度纳入状态图。如果你完全没接触过这个技巧考场上非常难临时想出来。建议后续准备的同学把这个题型作为重点学习可以参考“状态压缩最短路”“分层图最短路”这两个关键字去刷题。3. 算法策略岗笔试和普通开发岗笔试的差异为什么考这些不考那些3.1 和普通后端笔试的题目风格对比我同期有个朋友投的美团后端开发岗他的笔试题目风格是大量考察二叉树遍历、链表操作、LRU缓存、字符串处理题目更偏向工程实现。而我的算法策略岗笔试四道题全部是“业务场景描述 策略优化目标”的组合体。同样的知识点开发岗可能直接给你一个单链表算法策略岗则会把链表包装成一个“订单处理队列”。这说明算法策略岗不只是考你能不能写出代码更考你能不能从业务中抽取出“优化函数”和“约束条件”。比如第一道题如果你把它还原成“最小化所有任务完成时间之和”这不就是一个流水线调度问题吗第二道题还原成“区间重叠覆盖计数”这不就是差分数组的教科书场景吗算法策略岗的日常工作就是这种“翻译”——业务方说“我们希望骑手少等待”你得把它翻译成“所有订单取餐等待时间总和最小”然后才能谈用什么算法求解。3.2 选择题中的算法理论粒子群、模拟退火、卡尔曼滤波等到底要不要准备这次选择题里出现了几道让我印象深刻的算法理论题包括粒子群算法的原理、模拟退火算法的接受准则、卡尔曼滤波的预测-更新两个阶段。这些算法在算法策略岗的实际业务中确实有用武之地比如路径规划中的模拟退火、参数调优中的粒子群、实时轨迹预测中的卡尔曼滤波。但是在笔试阶段它们基本只会在选择题里出现不会在编程题里考。因为篇幅有限编程题没法让你手写粒子群优化它更多是考察这些算法的基本概念和适用场景。所以我的建议是准备时间紧张的话这些内容不用深究会判断应用场景和基本原理就行把时间和精力放在四大数据结构、高频算法模板上。我整理了一个针对性较强的考点优先级参考考点优先级出现形式理由贪心 优先队列最高编程题业务调度场景的基础前缀和 / 差分数组最高编程题区间统计类业务非常常见图论最短路Dijkstra高编程题路径规划和网络流基础动态规划背包、区间、状态压缩高编程题资源分配和策略优化的核心KMP / 字符串哈希中高编程题文本匹配和关键词抽取场景二分答案 / 双指针中高编程题搜索最优解类业务树 / 并查集中选择题/编程题连通性判断、聚类分析排序算法原理与复杂度中选择题基础中的基础粒子群 / 模拟退火 / 卡尔曼滤波低选择题知道场景和思想即可机器学习理论偏差方差、过拟合低选择题基础概念有点反直觉的是堆排序和快速排序这些基础排序算法在编程题里几乎不会直接考反而在选择题里会以“某排序算法在基本有序情况下的复杂度”这种形式出现。所以刷题时要抓住思维主线不要沉迷于排序算法的各种花式优化。3.3 笔试背后隐含的岗位能力要求美团算法策略岗核心负责的是搜索、推荐、广告、配送调度等方向日常工作中最常做的事情就是在给定约束下优化一个目标函数。这个工作会拆解成几个能力点能够把业务目标拆解为数学和算法问题——对应到笔试题就是“读题后快速识别出该用贪心、DP还是图论”的能力。能够高效实现原型——对应到编程题就是ACM模式下快速写出无bug代码的能力。能够分析复杂度和验证可行性——对应到编程题里对数据范围的敏感度比如看到n 10^5你就要马上意识到O(n^2)不可行需要优化到O(n log n)。能够理解概率和统计——对应到选择题里的机器学习和算法基础。所以你看这四道编程题不是随意出的每道题都对应着一项岗位能力。准备笔试不光是刷题更要思考题目背后的这个逻辑。4. ACM模式与笔试环境踩坑清单4.1 输入输出格式的坑牛客网的ACM模式输入输出格式是严格判定的多打一个空格、少换一次行都可能判错。我这次笔试就遇到一个情况第一道题的输入里每一行有两个整数但题目没有明确说明有多少组输入只给了一组。这种情况下如果用了while(cin a b)循环读入就会因为多读了空行而陷入死循环或读入错误。正确做法是第一行读入n然后循环n次读入。如果你是while(cin)派遇到这种题要先看第一行是否指定了数量。另外输出格式方面力扣的核心代码模式完全不需要你输出但ACM模式每一道题都需要输出最终答案。如果你忘了cout ans endl提交后一定编译通过但结果错误非常冤枉。4.2 数据类型和溢出问题四道题里两道题都涉及了很大的数据范围尤其是第二题的时间点范围可能到10^9第一题的答案也可能超过int范围。如果ans和now都定义成int部分测试用例一定会溢出挂掉。我在考场上第一道题一开始就用了int后来觉得不太对改成long long才过。这个细节往往是看了部分用例之后才发现的但那时已经浪费了时间。给个忠告笔试中涉及“累计和”或“总时长”的变量直接用long long不要抱侥幸心理。在当前的数据规模下一个数组前缀和就可能超过2^31-1。4.3 边界条件的魔鬼细节第三道题的不重叠匹配就是一个典型的边界条件题。如果你只写了普通KMP没有判断matchStart lastMatchEnd那么输出的答案会比正确答案大。比如主串aaaa模式串aa普通KMP会输出3不重叠匹配会输出2。很多人在本地测试时用的都是不重叠的数据所以代码没暴露问题但线上测试一跑立刻挂掉。边界条件测试法总结一下拿到题先看数据范围的上下界然后构造三个用例——最小输入、最大输入、边界特殊情况。比如n0时怎么办区间两端重合时怎么办模式串比主串还长怎么办这些情况考场上不会有人提醒你全凭平时刷题养成的条件反射。4.4 时间复杂度的现场估算方法我在笔试现场常用的估算法是1秒大约能跑10^8次简单操作C在牛客网服务器上大约是这个量级。如果数据范围是10^5那么O(n^2)是10^10必然超时O(n log n)是10^5 * 17约等于1.7 * 10^6非常安全O(n)更是没问题。所以在读完题后第一件事不是想解法而是看数据范围。如果数据范围是10^9那基本告别了O(n)级别的遍历只能考虑二分答案、数学公式、矩阵快速幂、状态压缩DP如果状态数极小等方案。这个“看数据范围定算法”的习惯是我从小到大参加算法竞赛养成的笔试中同样适用。4.5 做不出完整解法时的保分策略第四道题我没能在时间内写出满分解法但我没有直接放弃而是把暴力BFS版本的代码提交上去过了大约30%的测试用例。在美团笔试这类线下笔试题里每一道题的测试用例都有积分权重部分通过能拿对应比例的分数。所以无论如何都要提交一个至少能处理小数据规模的暴力版本。保分策略具体步骤如下先用最暴力直接的方式解出小规模用例比如DFS枚举所有路径。保证输入输出格式正确。针对特殊情况比如k0时没有优惠券写上特判这通常能额外覆盖几个测试点。如果时间允许再对暴力算法做一点记忆化优化争取覆盖更多用例。5. 基于此次笔试的备考优先级复盘哪些算法真的值得刷5.1 最值得投入的算法模块根据我自己的经历和这次笔试暴露出来的考点我把算法策略岗笔试的知识点按照“投入产出比”排了个序供你参考。第一梯队必须熟练掌握到“肌肉记忆”程度贪心算法尤其是优先队列贪心、前缀和与差分数组、二分答案、动态规划背包、最长上升子序列、区间DP、图论最短路Dijkstra、Floyd、Bellman-Ford。这些是美团笔试中出现频率最高、也是各类策略岗面试中会被反复追问的基础。第二梯队要熟练但不能过分钻牛角尖KMP、哈希、并查集、拓扑排序、树状数组、线段树基本用法。这些知识点在笔试中会出现尤其是字符串和区间维护类题但出现频率低于第一梯队。第三梯队了解思想即可粒子群算法、模拟退火、遗传算法、卡尔曼滤波、蒙特卡洛方法。这些在选择题里会碰见考的是“是什么、什么场景用、有什么优缺点”这种概念题不需要手写实现。但面试环节有可能会问到你对这些算法的理解所以不能完全空白至少要知道它们属于启发式搜索或状态估计范畴与确定性算法如Dijkstra有本质区别。5.2 一个反直觉的经验复习DP比刷题量更重要我在准备阶段刷了700多道题但这次笔试遇到第四道“带状态约束最短路”时仍然没能快速做出来。原因是我虽然见过分层图最短路这种题型却没有在一个统一框架下理解它。后来复盘时我发现分层图最短路完全可以看作是一种动态规划的变体——状态是(当前节点, 已使用的优惠券掩码)转移方程是“从状态A到状态B的最短距离”Dijkstra只是在执行这个状态转移图上的拓扑序搜索。如果我在准备阶段把动态规划学得更深看到这题时就会条件反射地想到“状态设计”而不是被题目包装的“图论”表象困住。所以我的体会是不要花太多时间在一个一个孤立的知识点上而是要建立知识点之间的连接。你能把KMP理解成自动机、把差分数组理解成前缀和的逆运算、把分层图最短路理解成DP套图论你才能在考场上真正游刃有余。5.3 真题练习的侧重点从业务场景还原算法模型美团笔试的一大特点就是“业务场景驱动”所以备考时要有意识地做一件事把业务题目转换为标准算法题。具体做法是做题时拿到题目先读三遍圈出所有数字、约束、目标函数然后在草稿纸上写下“这不是XX问题吗”的判断。比如看到“求最大收益”要想到背包或贪心看到“求最少步数”要想到BFS或Dijkstra看到“求一段连续区间满足某种条件”要想到前缀和/滑动窗口。我推荐你练习时多从历年美团真题牛客网、赛码网上都能找到入手而不是只刷通用题集。原因是通用题集的题目通常已经帮你抽象好了你不需要做“识别业务场景”这一步。真正贴近招聘需求的训练是拿到一个“外卖商家排序”“骑手路径合并”“优惠券分发配额”这类描述让你自己判断考点在哪里。这个识别能力才是笔试的核心竞争力。5.4 考前一晚的高效准备节奏笔试前一晚不需要再碰新题。我踩过坑考前疯狂做新题导致大脑过载考场上反而思路不清晰。正确做法是花两小时把最核心的模板过一遍包括KMP、Dijkstra、差分数组、快速幂、并查集、常见的DP转移方程再花半小时手写两个ACM模式下的输入输出模板。然后早点休息。另外有个小技巧把常用数据结构的模板整理到一个文档里考试时如果允许使用本地参考资料部分公司允许部分不允许可以直接查阅。即使不允许你在整理的过程中已经加深了记忆一举两得。6. 给2025年及以后准备美团算法策略岗的同学的一些实用建议6.1 不要只刷力扣一定要做ACM模式的模拟这是我最想强调的一点。我见过太多在力扣上刷题很顺的同学一到牛客网的ACM模式就抓瞎。原因很简单力扣已经帮你把函数签名、输入输出全部定义好了你只需要写核心逻辑而笔试平台要求你自己处理所有IO细节。这种差异在时间紧迫的笔试中会被无限放大。建议每周至少做三次ACM模式的模拟笔试每次两个小时四道题完全按照考试节奏来。做完之后不要只看正确率要复盘每道题的“问题建模”过程——你花了多少时间读懂题目花了多少时间确定算法花了多少时间写代码和调试。时间占比如果失衡说明你的薄弱环节在哪个模块就一目了然了。6.2 针对算法策略岗的专项准备多练“优化类”和“调度类”题型算法策略岗和其他算法岗比如CV、NLP有个明显区别它非常关注资源调度、排序融合、路径规划这类场景。所以除了通用算法题外我建议专门练以下几类题型各种形式的调度问题单机调度、多机调度、带截止时间调度排序融合问题多路归并、TopK、加权排序路径规划问题带约束最短路、旅行商问题的小规模解法配额分配问题背包、线性规划思想力扣上搜索“task scheduler”“schedule”“delivery”“route”等关键词能找到不少相关题目牛客网上美团历年真题更是直接反映了这些题型。做完之后不要满足于AC要思考你的解法在实际业务中会怎么落地。比如你写了一个优先队列贪心你可以想想实际的外卖调度系统里骑手数量会不会影响这个贪心的最优性。6.3 代码风格和命名习惯让面试官看起来舒服笔试虽然不直接看代码风格但美团算法策略岗的求职流程一般是笔试通过后进入面试面试官手里会有你的笔试代码。如果你的代码变量命名随意、逻辑混乱面试官可能对你的代码质量产生疑虑。我养成的习惯是变量名用有业务含义的单词比如pickupTime、deliveryTime、remainingMask而不是a、b、c关键步骤写注释函数拆分成有意义的模块而不是一坨到底。这些细节在笔试中体现为“逻辑清晰的代码更容易调试”。你在考场上的代码很可能成为你面试时被追问的对象所以认真对待每一次笔试的代码就像对待要提交到生产环境的代码一样。6.4 笔试只是起点后续面试中的算法考察更灵活最后说一个很现实的体会即使笔试过了后续的算法策略岗面试还会更深入地考察算法能力。美团面试中常见的算法题往往不只是让你写出解法还会追问你的算法在数据量扩大十倍之后还成立吗如果增加一个约束条件你怎么调整这个问题的暴力解、较优解、最优解分别是什么复杂度如何和你业务相关的场景比如骑手调度你会怎么建模这些问题的底层能力还是你在准备笔试时练出来的思维模型。所以不要把笔试当成一个临门一脚的事它其实就是你整个面试准备过程的第一环。把这篇文章里提到的每一个“为什么”都搞懂你之后面试时被追问也不慌。6.5 关于心态和临场发挥的几条硬经验遇到读了两遍还没思路的题果断跳过先做后面的。美团笔试的题目顺序不完全等于难度顺序我这次第三题比第二题简单如果我先死磕第二题就会浪费第三题的时间。编程题只过了部分用例时也要先把当前版本提交掉拿到保底分数再继续优化。不要觉得“没满分就没意义”部分分在总分里是最实在的。选择题不要空着。即使是完全不会的算法理论题也要用排除法排除掉明显错误的选项然后蒙一个。美团笔试的答错不扣分。考场上要带手表或注意看平台自带的倒计时。牛客网的界面倒计时比较小容易忽略。最后15分钟一定要检查自己所有提交过的题确认输出格式没有低级错误。我自己考完之后最大的感受是这场笔试给我的不是“我终于拿到了面试资格”的欣喜而是“我知道自己下一步该补什么”的清晰。算法策略岗不是一个靠刷题量就能堆出来的岗位它要求你真正理解算法背后的适用条件、复杂度瓶颈和业务含义。希望这篇复盘能帮你少走一些弯路。如果后面还有关于面试、项目经历的疑问也欢迎交流。