美团算法策略岗秋招笔试复盘:KMP与动态规划高频考点解析

发布时间:2026/9/1 22:06:47
美团算法策略岗秋招笔试复盘:KMP与动态规划高频考点解析 2025年秋招美团算法策略端第二批笔试刚结束没多久趁着记忆还热乎我把整场笔试的题型、考点、答题节奏和踩过的坑完整复盘一遍。这次投的是算法策略方向笔试内容和纯后端开发、纯算法研究岗都不太一样既考代码硬功夫也考策略思维和机器学习基础覆盖面很宽。如果你是准备算法岗秋招的同学尤其是目标锁定在美团这类大厂策略团队这份复盘应该能帮你少走不少弯路。先说结论整场笔试一共四个部分核心是两道中等偏上的编程题加一批机器学习/深度学习概念题外加一些策略场景分析。时间上不算特别宽裕但也不是做不完的程度。编程题考察范围集中在字符串、动态规划、贪心和数据结构这几个方向和网上流传的美团算法岗题库高度吻合但第二批的题目在细节上做了不少变形直接背原题答案基本没用得真正理解底层原理。下面我按板块拆开讲。1. 笔试概况与整体应对策略1.1 题型分布与时间分配美团这批笔试是牛客网系统全程摄像头监控加屏幕录制一共120分钟。整体题型分布大概是这样的题型题量分值占比建议用时单选题机器学习/深度学习基础10题30%20分钟多选题算法与数据结构5题20%15分钟编程题ACM模式2题40%55分钟策略场景分析题2题10%30分钟选做题一般出现在选择题和场景分析题里整体答题顺序我强烈建议先做编程题再做选择题最后做场景题。原因很简单编程题分值高、区分度大而且写到一半如果被选择题干扰容易断思路。选择题就算时间紧张也能蒙编程题蒙不了。我在实际考试里是先花15分钟快速扫了一遍全部题目对编程题的难度心里有数之后直接开写代码。两道编程题分别卡在字符串匹配和动态规划上正好是热搜词里反复出现的KMP算法和动态规划体系说明美团出题方向和主流算法题库高度一致没有偏门东西。1.2 算法策略端笔试的特殊性算法策略岗的笔试和普通开发岗有一个明显区别它不只看你会不会写代码还看你有没有策略建模的思维。这一点在选择题和场景题里体现得很明显。比如有一道选择题考到特征工程中类别特征的处理方式选项包括独热编码、目标编码、频数编码和标签编码。普通开发岗可能一辈子不碰这种题但算法策略岗必须懂。还有一道多选题问到GBDT和随机森林的区别考察的点是基学习器的相关性、对异常值的敏感度、训练方式的差异。这些都是策略岗日常工作中真正会用到的知识。所以如果你打算投算法策略方向笔试准备不能只刷LeetCode机器学习基础、特征工程、模型评估这些内容一定要系统过一遍。热搜词里提到的机器学习算法、深度学习算法、XGBoost算法在美团这批笔试里都有涉及虽然不会让你手推公式但概念题和场景判断题非常多。1.3 备考优先级排序基于这次笔试的体验我把算法策略端笔试的备考优先级整理成了一份清单按性价比排序第一优先级动态规划背包、区间、状态压缩、字符串KMP、滑动窗口、贪心算法。这三个方向是编程题的主力我这次两道编程题一道是KMP变形一道是区间动态规划几乎就是照着重点考的。第二优先级二叉树和堆堆排序、TopK问题、图论基础Dijkstra、二分图匹配。选择题里出现频率很高但不一定出编程大题。第三优先级机器学习基础概念、特征工程、模型评估。这是策略岗区别于开发岗的部分选择题和场景题的分数全靠这个板块。第四优先级排序算法细节、二分查找变形、位运算技巧。这些通常作为编程题的辅助考点出现比如考你快速排序的稳定性或者堆排序的建堆复杂度。单选题里还出现了两道印象深刻的题一道考堆排序的建堆时间复杂度和空间复杂度一道考快速排序在最坏情况下的时间复杂度。这两题都是基础题但统计出来错误率一直很高原因很多同学背了结论但不知道为什么。堆排序建堆是O(n)不是O(nlogn)很多人记错这里后面我会展开讲。2. 高频考点深度拆解与原理分析2.1 字符串算法KMP的next数组是必考热搜词里在kmp算法中对于模式串pabacaba其next数组这类的搜索记录很多说明KMP是很多人笔试前临时抱佛脚的重点。美团这次笔试虽然没有直接出KMP模板题但编程题里的字符串匹配明显是在KMP思路上做的变形选择题也考了next数组的语义理解。KMP的核心难点不在于匹配过程而在于next数组的求解。next[i]的定义是模式串P的前缀P[0...i]中最长相等前后缀的长度有的教材叫prefix函数。举个例子模式串abacaba的next数组计算过程如下next[0] 0单个字符没有真前后缀。next[1] 0前缀ab最长相等前后缀为0。next[2] 1前缀aba前缀a等于后缀a长度为1。next[3] 1前缀abac最长相等前后缀为0这里要注意P[3]c和P[0]a不匹配所以next[3]0。很多人这里算错因为写代码时从0开始和从1开始下标差一位。next[4] 1前缀abaca后缀a匹配长度1。next[5] 2前缀abacab后缀ab匹配长度2。next[6] 3前缀abacaba后缀aba匹配长度3。所以模式串abacaba的next数组是[0, 0, 1, 0, 1, 2, 3]。这道题如果出成选择题关键就是别把下标搞混。很多教程用next数组第一位存-1的写法牛客网的题通常用0起始的prefix函数版本做题前一定先看题目给的定义这是经验之谈。KMP为什么能在线性时间完成匹配核心思想是主串指针永不回退当匹配失败时模式串根据next数组向前滑动到最长相等前后缀的位置。这个设计和策略岗做特征匹配的思路很像利用已经计算过的信息避免重复劳动。2.2 动态规划美团笔试的压舱石动态规划是美团算法笔试的绝对主力我这次遇到的编程题就有一道区间DP。热搜词里动态规划反复出现不是没有原因的。美团算法策略岗日常做定价、补贴、流量分配很多问题本质都是多阶段决策优化动态规划是基本功。笔试考动态规划的难度通常控制在以下三个层次入门层一维DP如斐波那契、爬楼梯、最大子数组和。状态定义简单转移方程一眼能看出。进阶层二维DP如背包问题、最长公共子序列、编辑距离。需要自己设计状态维度。挑战层区间DP、状态压缩DP、树形DP。这类题通常作为区分度题目出现。美团第二批笔试那道区间DP题的具体题目大意是给定一个数组每次操作可以合并相邻两个数合并代价是两数之和问合并成一个数的最小总代价。这就是石子合并问题的经典变体状态转移方程如下dp[i][j] min(dp[i][k] dp[k1][j] sum(i, j))其中i ≤ k j。时间复杂度O(n³)n ≤ 300时可以接受。我在笔试里第一时间想到了用前缀和优化区间求和这一步很关键因为如果每次转移都重新遍历计算区间和复杂度会退化到O(n⁴)在数据量稍大的情况下会直接超时。这是动态规划题目里最常见的性能陷阱。还有一道选择题考了01背包和完全背包的区别这个也值得多说一句。01背包的一维滚动数组需要倒序遍历完全背包是正序遍历本质区别在于每种物品是只能取一次还是可以取无限次。倒序遍历确保dp[j-weight[i]]不会被当前物品覆盖正序遍历则允许在同一轮中重复使用当前物品。理解了这个原理比背代码管用得多。2.3 排序算法与堆选择题重灾区排序算法在美团笔试选择题里出现频率极高热搜词里冒泡排序算法c、堆排序算法、数据结构排序算法的搜索量也佐证了这一点。我这次遇到的选择题包括快速排序最坏时间复杂度是多少答案是O(n²)发生在每次划分都极度不均匀时比如已经有序且选第一个元素做pivot。平均是O(nlogn)最坏是O(n²)这两个都要记住。堆排序建堆复杂度是多少答案O(n)不是O(nlogn)。很多同学答错是因为建堆过程看起来每个元素都要下沉但实际分析会发现越靠近叶子的节点下沉次数越少整体累加是一个收敛的级数结果是O(n)。这里有个快速记忆方法堆排序总复杂度是O(nlogn)其中建堆O(n) 每次取出堆顶O(logn) 共n次所以取n个元素是O(nlogn)。稳定的排序算法有哪些冒泡排序、插入排序、归并排序、基数排序是稳定的选择排序、快速排序、堆排序、希尔排序是不稳定的。这是一个高频考点稳定性的定义是相等元素的相对顺序在排序后不发生改变。对于排序这块我建议把每个排序算法的时间复杂度最好/平均/最坏、空间复杂度、稳定性整理成一张表笔试前十分钟快速过一遍。这种题基本都是送分题丢分太可惜了。2.4 策略场景题算法岗的隐性门槛场景题是美团算法策略端笔试相对比较特殊的题型我在第二批里遇到的大意是外卖平台希望优化配送时长预估现有特征包括商家出餐时间、骑手位置、天气、历史配送时长等要求设计一个特征体系和模型方案。这种题没有标准答案考察的是你的策略建模思路是否完整。我的答题框架大致是这样的第一明确业务目标。配送时长预估的核心是减少超时率、提升用户体验但也要考虑骑手配送效率和成本所以目标函数可能是预估误差最小化和超时惩罚最小化的加权组合。第二特征设计。商家侧用出餐时间分位数、历史出餐均值、高峰期标志骑手侧用当前单量、距离、历史平均速度环境侧用天气编码、节假日标志、区域拥堵指数。这里我特意写了目标编码的思路因为纯独热编码在高基类别特征比如商家ID上会爆炸。第三模型选型。我写的是GBDT LR的组合方案GBDT负责自动发现高阶特征交叉LR负责最后的概率校准。如果追求可解释性就用XGBoost加SHAP值分析特征重要性。第四评估与迭代。离线评估用MAE和超时率线上用AB实验验证同时要监控特征漂移。这个答题框架是我在实际项目里总结出来的笔试前看了一眼正好用上。场景题的判分标准大概率是看结构完整性和关键点覆盖度不需要写代码但一定要有逻辑。3. 核心编程题实操复盘3.1 字符串匹配变形题从KMP到扩展KMP我这次遇到的第一道编程题题目大意给定文本串S和模式串P求P在S中出现的位置但如果P中某个位置的字符与S不匹配允许跳过S中连续的k个字符继续匹配。输出所有可能的匹配起始位置。这题本质是KMP的变体多了一个允许失配跳过的约束。我当时的解题思路是先计算模式串P的next数组然后正常做KMP匹配但匹配失败时不是直接将模式串滑动到next[j]而是记录当前主串位置检查剩余失配次数是否充足决定是否跳过当前字符继续匹配。核心代码如下def kmp_with_skip(s: str, p: str, k: int): n, m len(s), len(p) # 计算next数组 nxt [0] * m j 0 for i in range(1, m): while j 0 and p[i] ! p[j]: j nxt[j - 1] if p[i] p[j]: j 1 nxt[i] j res [] i j 0 skip_used 0 while i n: if s[i] p[j]: i 1 j 1 elif skip_used k: skip_used 1 i 1 else: if j 0: j nxt[j - 1] else: i 1 skip_used 0 if j m: res.append(i - m) j nxt[j - 1] skip_used 0 return res这段代码我在笔试时调整了大概四五个版本才通过主要卡在skip_used的处理上。我一开始的实现是全局累计跳过次数没有在每次匹配失败重新计算时重置导致匹配位置判断出错。后来改成每次模式串回退时重置skip计数才通过。这里分享一个调试经验字符串匹配类题目边界条件特别容易出错尤其是空串匹配、模式串比文本串长、k等于0这三种情况一定要在写核心逻辑之前先想清楚。k等于0时这题就是标准KMP如果你用skip版本直接套会发现有些样例不过要单独判断。3.2 区间动态规划题石子合并变体第二道编程题是标准的区间DP题目大意是给定一个长度为n的数组每次可以选择一个元素删除删除代价等于该元素当前值与相邻两个元素中较小值的乘积问删除到只剩一个元素的最小总代价。备选思路是区间DP定义dp[i][j]为区间[i, j]内元素被删除到只剩i和j两个端点时的最小代价。这里的关键是理解最后一个被删除的元素是谁以它作为分割点把区间分成两半。状态转移dp[i][j] min(dp[i][k] dp[k][j] a[i] * a[k] * a[j])其中i k j。这个转移方程的直觉是最后被删除的元素是k此时区间里只剩下i、k、j三个位置删除k的代价是a[i]*a[k]*a[j]。区间[i,k]和[k,j]内部的删除顺序不影响k最后被删所以可以分别求解。初始化dp[i][i] 0dp[i][i1] 0两个元素之间没有可删的最终答案是dp[0][n-1]。区间DP的遍历顺序很讲究必须按照区间长度从小到大枚举不能按照左端点顺序枚举否则后面的状态依赖前面的状态还没算出来。我在笔试时一开始用左端点从小到大遍历结果答案一直不对后来改成按区间长度枚举才通过。这道题网上有类似的题目叫戳气球核心思路一模一样就是绕了一个合并或者删除的壳。如果你在准备美团笔试建议把这类区间DP题刷熟因为出题人非常喜欢把经典DP题换一个业务场景来包装。3.3 编程题的ACM模式注意事项美团笔试用的是ACM模式也就是需要自己处理输入输出。这一点和力扣的核心代码模式完全不同很多只刷力扣的同学第一次上考场就直接懵了。几个常见坑输入可能有多个测试用例需要用while循环读取而不是只读一次。输入的分隔符可能是空格也可能是逗号或分号读之前先看题目描述。输出格式要求精确到小数点后几位时用format或f-string不要用字符串拼接近似。Python的递归深度默认1000如果DFS深度可能超过这个值要么改成迭代要么在开头加sys.setrecursionlimit(1000000)。我在这次笔试中就用Python写的牛客网的Python环境是3.8左右支持的语法范围够用。不过要注意有些算法题用Python跑大数据量会TLE比如O(n³)的区间DP在n500时Python大概要几秒钟而C只要几百毫秒。美团笔试不限制语言如果你C熟练建议直接用C尤其是涉及大量循环的题Python性能差距会比较明显。4. 常见问题与实战避坑清单4.1 时间分配失衡死磕难题导致简单题没时间做我这次笔试遇到的一个真实问题是第二道编程题在状态转移方程上卡了大概20分钟导致最后策略场景题只能草草写了几行。复盘来看这是典型的时间分配失误。区间DP那道题我一开始没识别出来以为是什么贪心尝试了好几种错误贪心策略后才调整思路浪费了大量时间。建议的时间分配策略是拿到题目后先判断题型给自己设一个硬止损时间。比如一道编程题如果10分钟内没有明确思路先标记跳过做后面的题最后再回头补。选择题能明显提升分数不要因为编程题卡住而失去了唾手可得的选择题分数。4.2 边界条件漏判自测用例要覆盖极端情况编程题的边界条件是失分重灾区。常见的边界情况包括数组长度为0、数组长度为1、目标值正好等于边界值、全部元素相同、输入含有最大值或最小值。我写第一道KMP变形题时就漏掉了k0的情况导致模式串匹配失败时逻辑走偏。后来我在本地补测了k0、模式串为空、文本串为空等几个测试用例才把问题定位清楚。这里有个小技巧笔试环境通常支持本地IDE写完代码后不要急着提交花两分钟在自己的IDE里把边界用例跑一遍。牛客网虽然也提供在线调试但本地IDE的打点调试更方便。4.3 内存超限和超时注意数据规模提示笔试题目通常会给出数据规模比如n ≤ 10^5这个信息非常关键。看到n10^5级数据基本就说明O(n²)算法要不得必须往O(nlogn)或O(n)方向想n ≤ 300时O(n³)可以接受区间DP就是为这个数据量设计的。还有内存问题。二维DP数组在n1000时是100万个数Python里用list存储会占几十MB看起来没问题但如果n5000二维数组就要2000万个数可能直接MLE。这时要考虑用滚动数组优化空间或者改成两个一维数组交替使用。4.4 选择题常见混淆点概念必须理解透美团笔试选择题的选项设置非常讲究每个错误选项都来自真实的高频错误认知。我在复盘时记录了几个典型混淆点混淆点正确答案错误认知KMP时间复杂度O(nm)最坏也是线性的O(n*m)以为会回溯主串堆排序稳定性不稳定稳定因为堆结构调整会破坏相等元素顺序快速排序最坏情况O(n²)O(nlogn)只记平均忘了最坏01背包一维遍历顺序倒序遍历正序遍历建堆时间复杂度O(n)O(nlogn)这些点在热词搜索里几乎全都有了说明大家刷题过程中普遍踩坑。这里特别说一句堆排序不稳定堆排序在交换堆顶和最后一个元素时可能把相等元素的相对顺序打乱所以它是不稳定排序。这个知识点选择题里经常考但官方教材一般不会专门强调只能自己总结。4.5 策略场景题的答题框架策略场景题是本场笔试的压轴部分也是最没有标准答案的部分。我的建议是采用目标-特征-模型-评估四段式结构确保覆盖得分点。以下是一个答题示例框架业务目标分析预估配送时长核心是减少超时率同时保证骑手效率。目标函数可量化为MAE 超时惩罚项。特征体系设计商家维度出餐时长分位数、平均出餐时长、忙碌标志、骑手维度当前位置、接单量、历史平均速度、环境维度天气、时段、节假日。模型选择与理由XGBoost做基础模型可解释性好容易处理缺失值如果对推理性能要求高用LightGBM。上线前用历史数据离线评估MAE再做AB实验。异常与监控特征线上分布变化监测模型每日重新训练防止数据漂移导致效果衰减。这个框架不限于美团笔试几乎所有大厂的算法策略岗场景题都可以用这个套路回答。重要的是在回答里展示出你有真实的业务洞察而不是背书。5. 备考工具与提分技巧5.1 算法题的刷题路径准备美团算法策略端笔试刷题贵精不贵多。我个人的建议路径是先把动态规划背包、区间、状态机、字符串KMP、Manacher、滑动窗口、贪心这几个高频模块刷透再做综合模拟。具体刷题量参考LeetCode热题100里动态规划部分至少30题字符串部分20题贪心15题。每道题做完后不要急着下一题花10分钟整理思路把状态定义和转移方程写下来。我这次笔试能快速识别出区间DP靠的就是平时做了大量戳气球类的题目看到删除元素求代价就直接联想到了区间DP。题库推荐方面牛客网算法笔试题库、LeetCode题解区的高赞答案、以及Codeforces难度1200-1800的题都是很好的训练材料。Codeforces的题有一个好处是数据量大、输入输出刁钻能锻炼ACM模式的适应能力。5.2 对策略岗笔试来说机器学习要掌握到什么程度如果你投的是算法策略岗笔试里的机器学习选择题不是随便复习复习就能应付的。我这次遇到的知识点包括逻辑回归的损失函数与梯度下降推导。决策树的划分指标信息增益、信息增益率、基尼指数以及ID3、C4.5、CART的区别。随机森林与GBDT的基学习器关系随机森林的基学习器是决策树但要求树与树之间尽量独立GBDT的树之间是串行关系每一棵树拟合的是前面的残差。特征重要性排序树模型里常用的方式有基于不纯度减少的平均值以及基于permutation的重要性。过拟合的处理正则化、交叉验证、早停、Dropout。随机森林不容易过拟合但GBDT加正则项可以控制复杂度。这些内容推荐参考李航老师的《统计学习方法》前八章加上动手调一两个开源项目比如用sklearn跑一遍GBDT和随机森林的对比。笔试不是考论文概念清楚、公式能默写就行。5.3 如何高效利用晚上笔试前的最后两小时美团笔试通常是晚上19点到21点白天时间可以做这些事情下午做一套完整的模拟题严格按照考试时间限制来晚上考前一个半小时开始复习错题本和笔记不要再做新题了。临考前做新题容易产生挫败感和焦虑情绪反而不利于发挥。考前十分钟我习惯把高频公式和复杂度表在草稿纸上默写一遍包括KMP next数组求法、动态规划经典状态转移方程、排序算法复杂度表、树模型评价指标。这相当于给大脑建立索引遇到选择题时能瞬间调取。6. 写在最后从笔试复盘到长期积累整场笔试复盘下来我最深的体会是算法策略端的笔试其实像一场策略优化问题你的目标函数是在有限时间内拿到最高分数约束条件是知识点覆盖、代码熟练度、心态稳定性三个维度。资源分配要按高频考点优先、优势题型优先、可得分优先来安排。这次笔试的第二批题目不算太难但区分度很高。会做KMP和区间DP的同学能提前30分钟交卷不熟的同学可能第二道编程题直接在死胡同里出不来。如果你现在还在准备秋招我建议你在日常刷题时养成每个算法都手写一遍核心代码的习惯尤其是KMP、堆排序、快速排序、01背包这些经典实现。笔试题型的包装千变万化但内核对熟练的选手来说永远是那几板斧。最后再分享一个小技巧笔试结束后一定要回顾每道题把不会的知识点马上去查不要拖。这次笔试场景题里出现的目标编码我就不是很熟考完立刻去查了资料发现这是特征工程里处理高基数类别特征的标准做法。如果早一点知道这个技巧场景题还能答得更好。秋招是一段漫长的持久战每一场笔试、每一次复盘都是在积累自己的算法武器库。希望这份复盘能给你一些参考祝大家都能在后面的笔试里稳住心态、正常发挥。