算法策略岗笔试全攻略:从KMP到策略设计
这次笔试我从七月中旬开始准备到正式上考场前后大概花了一个半月。整个过程下来最深的感受是算法策略端的笔试重点其实不在算法而在策略这两个字上。如果只按普通后端研发岗去刷题大概率会在某些题目上摔跟头。这篇文章我把自己的复盘、踩坑、以及针对性的准备思路完整写出来希望能帮到后面几批或者明年秋招的朋友。1. 算法策略端这四个字决定了笔试考什么1.1 岗位名字拆开看为什么是策略而不是研发很多人在投递时会下意识把算法策略端和后端开发放在同一个赛道准备这其实是最大的误区。美团这类平台公司的算法策略岗通常负责的是排序、定价、供给分配、风控、营销等方向的策略优化本质上是在海量业务数据中寻找最优决策。所以笔试的考察逻辑会和纯后端有显著差异不只看你能不能写出一个能跑的程序更看你在面对不确定性和多目标约束时能不能拿出一个结构完整、可评估、可迭代的策略方案。我备考时翻了很多经验贴也找上一届拿到offer的学长聊过。综合下来这类笔试一般由两部分构成一部分是常规算法编程题用来筛基本功另一部分是策略设计或开放式系统设计题用来筛思维方式。两部分的时间通常分配在同一个在线笔试里总时长大概120到150分钟。很多人挂在第二部分不是因为代码差而是因为完全没有意识到会有这种题。1.2 岗位画像这类笔试到底想筛出什么样的人我自己的理解是这个岗位要的人必须同时具备三种能力算法基本功复杂数据结构、边界处理、时间和空间复杂度的把控。这部分是硬门槛不过关连面试机会都没有。策略建模能力给一个业务场景能拆解目标函数、设计约束条件、选择评估指标。比如如何让外卖首页排序在商家收入和用户体验之间取得平衡这种题没有标准答案但能看出一个人有没有策略思维。工程落地意识策略不是写篇小作文就完事要考虑上线、回滚、AB实验、数据埋点、效果评估。笔试里虽然不会让你真的写工程代码但方案里如果完全没有落地闭环会被认为只会纸上谈兵。如果已经投了或者正在准备这类岗位建议先用这个画像自测一下缺哪块补哪块。我身边有刷了300道LeetCode但策略题答得稀烂的朋友也有算法一般但方案设计能力很强、最终拿到offer的同学比例大概能说明问题。2. 算法题备考的优先级排序经典考点是主线2.1 字符串算法里的隐藏考点KMP的next数组怎么推算法编程题部分考的最多的依然是经典数据结构与算法。因为笔试是批量筛选题目难度通常会控制在不白给但也不至于劝退的水平。我这次准备时把核心精力放在几个必考类型上排序、二分、贪心、动态规划、字符串、树和图。其中有一个点特别值得拿出来单独说就是KMP算法。KMP在笔试中出现的频率不算低而且很多人刷题时用的是模板一旦让你手写next数组就卡壳。这里我用自己的理解再推一遍保证上手就能用。以热词里提到的模式串p abacaba为例。next[i]的定义是p[0...i]这个子串中最长的相等前后缀长度注意不能是整个子串本身。我们手动推一遍i0字符a没有真前后缀next[0] 0i1子串ab前缀a和后缀b不相等next[1] 0i2子串aba前缀a和后缀a相等长度1next[2] 1i3子串abac前缀ab和后缀ac不等前缀a和后缀c也不等next[3] 0i4子串abaca前缀a和后缀a相等长度1但再往前看前缀ab和后缀ca不等next[4] 1i5子串abacab前缀ab和后缀ab相等长度2next[5] 2i6子串abacaba前缀aba和后缀aba相等长度3next[6] 3所以next数组结果是[0, 0, 1, 0, 1, 2, 3]。这里有一个很多人容易犯的错求next[i]时要基于已经算出的next[i-1]去尝试扩展而不是重新暴力匹配前缀后缀。比如推到i6时因为next[5]2说明前5个字符abaca的最长相等前后缀是ab而我们发现p[2]a和p[6]a相等所以next[6]next[5]13。这个递推思想是KMP能在O(n)时间内完成匹配的核心笔试如果考到一定要能默写出来。2.2 排序算法的选择不是只会写快排就够了排序是笔试送分题但也最容易踩坑。要知道笔试里考排序不只是考能不能排出来而是考在特定约束下选哪个排序。我整理了一个常用对比表基本覆盖笔试的主要考点排序算法平均时间复杂度最坏时间复杂度空间复杂度稳定性适用场景冒泡排序O(n^2)O(n^2)O(1)稳定几乎不考除非让你手写最简单版本快速排序O(n log n)O(n^2)O(log n)不稳定最常考注意选pivot和退化问题归并排序O(n log n)O(n log n)O(n)稳定涉及稳定排序、逆序对时优先选堆排序O(n log n)O(n log n)O(1)不稳定TopK、流式数据、无需额外空间时计数排序O(nk)O(nk)O(k)稳定数据范围小且非负线性复杂度举个例子如果题目要求链表排序且空间复杂度O(1)那快排因为递归栈不算O(1)就不太合适通常用自底向上的归并排序如果题目是从海量数据中找最大的K个堆排序的维护成本最低如果题目要求按分数排序分数相同按姓名排序且保持顺序就只有稳定排序能做到。这些边界约束在真题里很常见备考时一定要带着为什么选它去刷题而不是只要AC就过。2.3 贪心、动态规划和搜索策略题的算法内核这个岗位的算法题我个人感觉比纯后端更偏爱策略型算法贪心、动态规划、回溯偶尔会来一道模拟退火或粒子群相关的小题。贪心算法的核心是每一步选当前最优,关键难点在于证明局部最优能推出全局最优比如区间调度问题按结束时间排序就是经典贪心。动态规划则更注重状态定义和转移方程笔试里常见的有背包问题、最长递增子序列、编辑距离、区间DP等。我备考时给自己定了一个要求每道DP题都要能讲清楚dp[i]代表什么、为什么这么定义、边界怎么处理而不是背转移方程因为面试时这一套完全可以复用。另外热词里反复出现的粒子群算法、模拟退火算法、遗传算法属于元启发式算法常用于连续优化或组合优化问题。笔试一般不会直接让你实现完整的粒子群但可能会结合策略优化场景考察思想。比如如何为一组超参数找到较好的取值组合你完全可以提用粒子群或模拟退火来搜索并说明粒子速度和位置的更新逻辑。我建议把这类算法的核心思想了解清楚尤其是如何平衡探索和利用这个观点在策略题里也很加分。3. 策略设计题不是写代码是给一整套方案3.1 策略题和算法题的本质区别算法题有标准答案策略题没有。我第一次做模拟策略题时完全懵了题目给了一段业务背景比如外卖首页推荐排序需要考虑哪些因素请设计一个排序策略并说明评估方法然后给我留了一大块空白。我当时按写作文的思路答了一堆后来才知道这种题是要用策略方案的结构来回答而不是写议论文。策略题的本质是在真实业务约束下设计一套可执行的决策机制。它考察的维度包括目标拆解把模糊的业务目标转化为可量化的目标函数。比如提升用户体验可以拆成点击率、转化率、完单率、客单价等多个指标。约束识别每个策略都有约束。比如排序不能只考虑平台收入还要考虑商家体验和骑手配送能力定价不能只追求毛利还要考虑用户流失率。可迭代性策略不是一次成型而是持续优化。所以方案里要包含实验设计、回滚机制、监控告警。边界与异常数据缺失怎么办新商家没有历史数据怎么办极端天气下的配送时间怎么调整这些边界处理才是区分有经验和没经验的关键。3.2 策略模式的工程化思维让策略可替换热词里出现了策略模式这也是我在准备策略题时觉得最有用的一个设计思想。策略模式的核心是定义一组算法把每个算法封装起来并且使它们可以互相替换。这个思路放到笔试里非常实用假设题目让你设计一个订单分配策略你完全可以用策略模式来组织你的方案基类/接口定义分配策略的统一接口比如assign(orders, riders) - assignments具体策略A距离优先策略适合订单密度高时使用具体策略B骑手负载均衡策略适合高峰期防止骑手过载具体策略C预计送达时间最短策略适合对时效要求高的场景策略切换机制通过一个工厂或者配置中心在不同时段、不同区域动态选择不同策略这样回答的好处是让面试官或阅卷人一眼就能看出你的方案是可扩展、可回滚、可灰度的工程化方案而不是拍脑袋想出来的规则堆砌。我后来把这种策略模式思维用在了几乎所有策略题里效果非常好。3.3 从量化交易和风控策略里提炼出的通用框架热词里有两类策略非常值得借鉴到笔试答题中量化交易策略和风控策略。量化交易策略的核心是回测。不管多复杂的策略都必须放到历史数据上验证计算收益、回撤、夏普比率等指标然后判断是否有效。这个思路套到业务策略题里就是任何策略都要有离线评估和在线验证。比如排序策略离线阶段可以用历史日志重排计算线上指标的变化在线阶段则通过AB实验小流量验证逐步放量。风控策略的核心是边界条件和对抗性。比如风控领域有该次请求被拒绝这种场景任何策略都必须考虑攻击者或异常流量。业务策略题也要有对抗性思维如果商家刷单怎么办如果用户恶意薅羊毛怎么办如果模型被逆向攻击怎么办我在一个模拟题里提到对新商家冷启动采用低置信度保守策略就是借鉴了风控思路中的在不确定性高的时候减少激进决策。所以备考策略题时不要只看技术类内容量化、风控、推荐系统这些领域的评估闭环和边界意识完全可以通用。3.4 策略方案的答题模板从目标到落地的五段式经过一次次模拟和复盘我总结了一个还算稳定的策略题答题框架分享出来供参考。不一定每道题都完全套用但作为骨架可以避免遗漏关键点背景理解与问题定义用自己的话复述业务场景明确要解决的核心问题不要直接给方案。目标拆解与指标定义列出核心指标和辅助指标说明每个指标怎么计算哪个是北极星指标。策略方案设计分点阐述策略逻辑尽量用规则模型结合的思路并说明为什么选择这个方案。评估与迭代计划离线评估方法、在线AB实验设计、灰度放量计划、回滚条件。异常情况与冷启动数据缺失、新客/新商家、极端情况下的兜底逻辑。我练了大概十道这种题之后基本能做到遇到任何业务场景都不慌因为框架已经内化只需要往里面填具体内容。4. 笔试现场的实战取舍时间分配与边界意识4.1 建议的时间分配方案美团这类在线笔试总时长一般120到150分钟可能包含4道左右编程题加1到2道策略设计题。我的建议是拿到题目先花5分钟全部浏览一遍给每道题标一个难易评级然后按先易后难、先编程后策略的顺序做。具体来说我会这样分配时间前30分钟完成2道简单/中等编程题确保AC稳定拿分。中间40分钟完成1道较难编程题如果卡了超过20分钟就先跳过不要死磕。接下来30分钟做策略设计题这是区分度最大的部分一定要留足时间不能因为前面的编程题写到上头就压缩策略题时间。最后10-15分钟回头补刚才跳过的编程题检查边界条件完善没有写完的思路。这套时间策略我模拟时就验证过有一次因为死磕一道DP题导致策略题只写了300字结果模拟得分惨不忍睹。后来调整顺序分数明显提高。4.2 边界条件最容易丢分的隐藏陷阱算法题的AC不只是思路对还有细节稳。笔试中我总结了几类高频边界陷阱空输入空数组、空字符串、null指针单元素输入长度为1的数组或字符串很多算法在len1时会有特殊问题大数溢出C/Java里int溢出是经典陷阱可以用long或提前判断负数与零涉及除法、取模时尤其要注意数组越界动态规划时常遇到dp[i-1]或dp[i1]的越界通常通过给dp数组多开一位来规避排序稳定性题目要求稳定排序时直接调库可能没问题但手写快排就不行有一个小技巧很实用在写完代码后花30秒构造几个特殊测试用例空、单元素、全相同元素、大规模随机数据在本地跑一遍再提交。在线笔试平台如果没有本地调试环境就自己在纸上脑补这几个用例再逐行走一遍代码。虽然听着土但真的能救你很多次。4.3 在线笔试环境下的应对策略在线笔试和平时刷题有很大区别不能访问LeetCode题解、没有智能提示有些平台有、IDE调试功能受限、网络可能波动。这些细节我吃过亏。比如有一次我在本地IDE里跑得好好的代码复制到在线平台后发现缩进全乱了还有一次因为忘记处理输入输出的多组测试用例格式导致一直卡在0%。我的建议是备考后期至少做3场全真模拟用和真实笔试相同的平台很多在线笔试平台都有模拟题、相同的时间限制、相同的输入输出格式。另外可以把常用代码模板快排、二分、并查集、拓扑排序、最短路、线段树、KMP、字典树等整理成自己的模板库考前反复默写做到不依赖IDE补全也能写出来。笔试环境通常不允许复制外部代码但模板存在自己脑子里比单靠刷题量有效得多。5. 考后复盘从笔试到面试怎么把经验最大化5.1 编程题的复盘标准不是AC了就结束笔试结束后我做的第一件事不是对答案而是把每道题按三个维度复盘思路对了吗复杂度对吗代码稳吗这三个维度缺一不可。很多时候AC了只是因为测试用例不够强算法本身可能是指数复杂度在大数据上会超时或者代码里用了大量魔法数字和硬编码面试官追问时根本说不清。我给自己定的复盘标准是能用文字写完一段完整的解题思路包括为什么选这个算法、边界怎么处理、复杂度是多少能对代码里的每个关键变量解释清楚作用能说出这个题目还可以怎么变形比如如果输入数据量大到内存装不下怎么办能用同一思路解决2道类似题型这个复盘标准对笔试和面试都有效因为面试时最常见的问题就是你当时怎么想的。5.2 策略题的复盘标准方案是否形成闭环策略题没有标准答案但复盘时可以问自己几个问题我有没有定义清楚核心目标还是直接跳到了方案我的方案有没有明确的指标来衡量效果如果策略上线后发现效果不好我的回滚方案是什么如果数据缺失或出现异常我的兜底逻辑是什么我的方案能不能解释给非技术背景的人听并且让他们觉得合理我每次模拟完策略题都会根据这五条给自己打分。如果某一题只写了策略逻辑没有写评估方案下一次就会刻意在评估部分多写一些。这些能力在后续面试中会直接派上用场因为策略岗面试大概率会问到如果你要上线一个XX策略你会怎么设计实验这类问题。5.3 后续准备方向把笔试暴露的弱点变成面试的素材我在这次笔试中暴露出的最大弱点是遇到业务背景较长、边界条件多的算法题时读题和提取信息的速度太慢。复盘后我专门找了一些长题干题目训练逼自己在5分钟内读完题并列出全部约束条件再开始动笔。经过两周训练这个短板基本补上了。另一个值得说的经验是笔试后不要立刻把题目忘掉。我会把每道题的场景、思路、参考实现写进一个专门的文档作为面试前的复习资料。因为策略岗面试经常会让你聊聊最近做的项目或研究的算法笔试中那些策略设计方案稍微加工一下就是很好的面试谈资。我当时在笔试里认真做了一道排序策略设计题那道题后来在面试中真的派上了用场。总的来说算法策略端的笔试是一个基本功策略思维的双重考验。算法题需要你像运动员一样保持肌肉记忆策略题需要你像产品经理一样去拆解问题。这两种能力看似互相独立但其实可以互相促进算法的严谨让策略方案更有说服力策略的全局观让算法选择更有针对性。我备考这段时间最大的收获不是刷了多少题、背了多少模板而是慢慢找到了两种思维模式的切换方式。希望这篇经验帖能帮你少走一些弯路。