
先说结论2024年秋招淘天集团算法岗的第一批笔试是我整个求职季里做得最纠结、也最值得回头复盘的一场。不是因为题目难得离谱而是它的题量设计、考点权重和考察方式都很有代表性——数据结构与算法基本功只是入场券选择题里藏的工程直觉和原理理解才是真正的分水岭。如果你正在准备算法岗笔试或者想了解大厂算法岗到底考什么、怎么考这篇文章应该能给你一个相对完整的参考。我参加的是2024年8月中旬的线上笔试双机位监控两个半小时题型是“4道编程题 一批选择题”整体感觉和牛客上的常规模拟题有很大区别。编程题的难度梯度明显前两题基本是给基础扎实的同学送分的后两题才是真正拉开差距的地方选择题则更刁钻不背八股的人很容易在这里栽跟头。下面我按照“考前了解→题型分析→逐题复盘→策略反思→准备清单”的顺序把我记录下来的东西完整展开。1. 考前必须搞清楚的笔试规则与岗位方向1.1 淘天算法岗的赛道差异笔试侧重点不完全一样阿里淘天集团的算法岗内部不是铁板一块。搜索推荐、机器学习平台、计算机视觉、自然语言处理等方向都会在秋招里发声但笔试往往是同一套题。这意味着你准备的方向未必能直接在题面上体现出来笔试考察的是“通用算法能力”而不是“深度学习论文复现能力”。这一点很重要很多人栽在这里。我同场认识的同学里有人主攻CVTransformer背得滚瓜烂熟结果笔试四道编程题全是字符串和树的题选择题里也没有一道跟卷积、注意力机制相关。相反有两道题反倒和KMP、排序稳定性的工程场景强相关。如果你事先不知道这个规律很容易在准备阶段跑偏。所以我的建议是投淘天算法岗之前别把精力全押在模型原理上数据结构、经典算法、排序、字符串匹配这些“本科基本功”一定要先过一遍。这场笔试明显在考察你能不能写出健壮的代码而不只是会不会调包。1.2 笔试的基本盘时间、题量、环境先说整体配置这批笔试总时长两个半小时题型分两部分选择题和编程题。编程题四道难度大致是从签到题到竞赛题的递增曲线选择题数量不算多但每题都需要认真推理不能秒选。线上笔试用的是牛客系统代码编辑界面支持常见语言C、Java、Python、Go等。我自己用C写的理由后面会讲。对了双机位意味着你得提前找个安静的房间手机架在侧面45度角保证手部和屏幕都能被看到。建议考前至少半小时做环境测试因为牛客在某些浏览器下切输入法会有bug我笔试时就有一次切换输入法导致代码缩进错乱后来不得不直接重启编辑器白白浪费了五分钟。另一个细节编程题是可以用本地IDE的前提是开了全屏锁定。我把模板代码在本地跑通后再贴回去速度比自己盲写快很多。后文的复盘里我会具体说哪些模板值得提前备好。2. 题型全景编程题是主战场选择题决定上限2.1 选择题的考点分布不背八股也能答对但要有原理选择题大概有十道左右分布在数据结构、排序、字符串匹配、图论、机器学习基础几个方向。最让我意外的是有好几道题是给了具体场景让你判断“该用什么算法”而不是直接问你“冒泡排序的时间复杂度是多少”。比如有一道题给了一个很大的用户行为序列要求快速找到某段连续子序列中某个模式出现的位置选项里有KMP、BM、Sunday、单纯暴力匹配。这种题如果只看过名字、没读过实现细节基本靠猜。但如果你能回忆起KMP的next数组是怎么构建的就能快速排除掉BM——因为BM的坏字符规则在模式串较短场景下优势不明显。还有一道和排序稳定性有关的题场景是“对订单先按金额排序再按时间排序要求第二次排序后不破坏第一次的顺序”选项是快排、堆排、归并、选择排序。这里考察的就是排序的稳定性归并排序最合适而堆排和快排都是不稳定的。这类题没有绕弯子就是看你基础扎不扎实。选择题里还有几道涉及“算法原理”的辨析题比如给定粒子群算法中某一轮迭代后的位置更新公式要求判断哪个公式写错了又比如给了KL散度和ELBO的关系问VAE训练时优化的目标是什么。这些题如果你只是背过概念名没推过公式很容易被干扰项带偏。整体来看选择题更像是一场“算法直觉”测试而不是“知识点复读机”测试。2.2 编程题的难度梯度前两题送分后两题拉分编程题一共四道我按印象还原一下难度结构题号大致考察点难度评估我的AC情况第一题数组模拟、边界条件处理较低约等于LeetCode Easy15分钟内AC第二题贪心/动态规划、前缀和优化中等约等于LeetCode Medium40分钟AC第三题字符串匹配、模式串统计中高需要KMP思想或哈希最后一刻过样例未完全AC第四题树形DP、剪枝、状态压缩较高接近竞赛题只过了部分测试点这个梯度设置非常典型。第一题考察的是基础代码能力第二题考察的是算法设计能力第三题考察的是“能不能把经典算法灵活运用”第四题考察的就是“在高压下能不能做出高质量的复杂度优化”。大部分人的分水岭出现在第三题和第四题之间。我的感受是前两题如果不AC基本就告别面试了第三题如果能AC大概率能进下一轮第四题能做出来的人已经不只是靠运气了。所以如果你时间有限前两道题务必保证质量第三道题尽量拿部分分第四道题如果读题超过十分钟还没思路果断放弃。3. 真题复盘四道编程题从读题到AC的完整链路3.1 第一题签到题也不该大意这题大意是给定一个数组每次可以选择一个连续区间把区间内的所有元素加一或减一问最少操作多少次能把整个数组变成全零。第一眼看像是差分数组的经典题但仔细想其实有坑——数据范围很大如果直接模拟区间操作时间复杂度直接爆炸。我的思路是把它转化成差分数组问题假设原数组是a[i]我们构造差分数组d[i] a[i] - a[i-1]i从1开始d[0] a[0]那么区间加一操作对应差分数组的两个位置变化目标是将整个数组归零等价于将差分数组都变成零。最少操作次数就是所有正差分之和或负差分绝对值之和两者天然相等。写起来其实很快C十几行就搞定了。但这里有一个细节很多人会把边界情况漏掉。比如数组只有一个元素或者数组中所有元素已经是零这两种情况都要单独验证。我在写的时候习惯先写一个check函数把样例跑通后再提交但笔试时第一题时间紧张很多人样例跑通就直接交结果边界没过。这种题建议多留十秒钟想一想“数组长度等于1时我的代码会不会越界”。为什么说这种题容易挂因为它太简单了简单到让人放松警惕。但只要错一个corner case整题就是0分没有任何部分分。所以第一题我的经验是AC不是目标快速且稳地AC才是目标。3.2 第二题贪心还是DP先证明再写第二题印象里是一个“背包变种”的题有一些任务每个任务有开始时间、结束时间和收益同一个时间点只能做一个任务问最大收益。看到这种题第一反应是区间调度但和经典活动选择不同这里的每个任务有收益权值不能简单地按结束时间贪心。我当时的思路是先把任务按结束时间排序然后动态规划。设dp[i]表示前i个任务能获得的最大收益转移时有两种选择不选第i个任务则dp[i] dp[i-1]选第i个任务则需要找到“最后一个结束时间小于等于当前任务开始时间”的任务jdp[i] dp[j] value[i]。关键在于怎么快速找到j。如果每次都用二分查找整体复杂度是O(n log n)完全没问题。但在考场上我第一遍写成了线性往前扫描找j结果一跑大数据直接超时。当时我有点慌因为时间已经过去了二十多分钟。后来冷静下来发现这个j可以用二分查找轻松搞定而且由于任务已经按结束时间排过序可以直接用upper_bound定位。这道题给我的教训是写动态规划时一定要先想清楚“转移时能不能用二分、前缀和、哈希表等数据结构加速”不要一上来就写暴力转移。很多笔试的第二题就是在基础DP上加一个优化点考察的是“能不能从暴力过渡到高效”。3.3 第三题当KMP思想披上“子串统计”的外衣第三题是我印象最深的一道题因为它的题干描述很日常化乍一看根本不像字符串题。大意是给定一个较长的文本串和一个较短的模式串问文本串中所有和模式串“循环同构”的子串出现位置有多少个。“循环同构”指的是字符串通过循环移位能变成另一个字符串比如“abab”和“baba”就是循环同构。看到这里我立刻想到了模式串匹配但循环同构让匹配条件变得复杂。最笨的办法是枚举所有循环移位然后对每一种移位跑一次匹配但模式串长度如果达到10的5次方这种做法的复杂度是O(n*k)绝对超时。我当时的第一反应是能不能用字符串哈希来做把文本串的每个长度为m的子串算一个哈希值同时把模式串的所有循环同构的哈希值存到一个哈希集合里然后逐个判断。这个思路理论上可行但哈希碰撞的风险让我心里不踏实——如果笔试的测试数据故意卡碰撞双哈希都未必保险。后来我又想到了KMP的思路。核心思想是把模式串变成两倍长度即pp然后判断原模式串的某个长度m的子串是否在pp中出现过。换句话说文本串中的子串如果哈希上等于pp中的某个长度m的子串哈希那它就是循环同构。这样确实可以借助哈希来快速匹配但等于还是回到了哈希。这道题我当时没能在规定时间内完全AC只过了部分测试点。复盘时我查到正确的做法是把文本串和模式串拼接用扩展KMPZ算法或后缀自动机来处理循环同构匹配复杂度可以降到O(n)。如果没有接触过扩展KMP很难在考场上想到这一层。这一题的启发很大笔试中很多看似新奇的字符串题本质都是在经典算法的“变体”上做文章。KMP的next数组思想、Z算法、字符串哈希、后缀数组这些都是算法岗必须提前吃透的基本盘。你不能只会背模板还要理解模板为什么能匹配、边界情况在哪里。3.4 第四题树形DP与状态压缩的取舍第四题是一道树相关的题大意是给定一棵树每个节点有一个权值要求选择若干个互不相邻的节点使得权值和最大同时要求选中的节点在树上不能相邻。这就是经典的“树上的最大权独立集”问题用树形DP可以解决。但这道题加了限制树的规模特别大而且每个节点的权值可能是负数负数的节点不应该选。树形DP的状态设计比较直接dp[u][0]表示不选u时以u为根的子树能取到的最大权值dp[u][1]表示选u时以u为根的子树能取到的最大权值。转移时如果选u则子节点只能取dp[v][0]如果不选u则子节点可以取max(dp[v][0], dp[v][1])。由于每个节点只遍历一次整体复杂度是O(n)。但这个题有一个容易忽略的细节权值有负数所以初始化dp[u][1]的时候如果u本身的权值是负的就没有必要一定选它。换句话说dp[u][1]的初值不应该是a[u]而应该是max(a[u], 0)不对实际上如果你选了一个负数节点收益反而更低所以应该直接不选。所以dp[u][1]的初值应该是a[u]但在转移时如果a[u]小于0那dp[u][1]就会小于dp[u][0]最终答案取max时自然就避开了负数。我复盘时发现这道题真正难的部分不是DP本身而是另一个约束如果树的规模很大递归深度可能爆栈。我在写的时候用了递归结果运行到深度接近几万的链状树时直接报栈溢出。后来改成显式栈或者用自底向上的拓扑序处理才稳过。这个坑在笔试环境里特别容易踩因为牛客的评测机栈空间限制和本地不一样。所以我的建议是涉及树的DFS时最好用迭代栈或者先拓扑排序不要依赖递归除非你已经确认最大深度不会爆栈。4. 选择题里暗藏的“算法直觉”考点4.1 排序稳定性与工程取舍算法岗不能只会写快排选择题里有一道让我印象特别深题目大意是一个电商系统需要先按用户等级排序再按下单时间排序且希望第二次排序不破坏第一次的分组秩序问该选择哪种排序算法。选项有快速排序、堆排序、归并排序、选择排序。这是一道很典型的“排序稳定性”考题答案当然是归并排序。但这里我想多说一句考场上很多人能记住“归并排序是稳定的”这个结论却不一定能说出为什么。归并排序在合并两个子数组时如果遇到相等元素可以保证来自左半边的元素仍然排在来自右半边的元素前面而这个特性恰恰是稳定性最核心的工程价值。如果你只是死记结论遇到“自定义比较器后能否保持稳定性”这种变体就容易翻车。类似的还有堆排序虽然时间复杂度理论上很漂亮但在实际工程中缓存不友好反而常常输给快排而选择排序的交换次数最少但不稳定。这些细节笔试选择题往往不会直白地问而是给一个业务场景让你自己判断。算法岗的同学一定要把“时间复杂度、空间复杂度、稳定性、原地性”这四个维度当成一个整体来理解而不是孤立地背某个算法。4.2 从重采样到图像算法工程场景里的边界思维还有一道选择题和音频重采样有关问的是“在改变音频采样率时哪个步骤是必须的”选项里有低通滤波、高通滤波、FFT、卷积。这个题对不做音频的同学来说有点懵但如果你理解采样定理就知道重采样之前必须做低通滤波来防止混叠。说白了就是当你降低采样率时高频成分会折叠到低频必须在降采样前滤掉否则声音会失真。这类题给我最大的感受是淘天笔试喜欢把经典的算法原理放到具体的应用场景里。比如考图像锐化时不是问你拉普拉斯算子的模板是什么而是给你一张模糊图片让你从多个卷积核里挑出能实现锐化的那个。如果你没有动手写过边缘检测、做过图像增强很可能选错。所以我建议准备算法岗笔试的同学不能只刷LeetCode还要适当了解几个典型的工程算法场景音频重采样、图像卷积、推荐系统的粗排精排、搜索里的BM25等。4.3 粒子群、模拟退火与强化学习谁在什么时候用选择题里有一道和粒子群算法PSO相关的题题干给了一个迭代公式问我哪个式子写错了。这题我反而觉得不难因为你只要记得PSO的位置更新公式是“当前位置速度”然后速度更新公式是“惯性项个体认知项群体社会项”三部分组成就很容易排除错误项。真正的难点在于区分这些“元启发式算法”的使用场景。比如粒子群、遗传算法、模拟退火、蚁群算法在有明确梯度信息时其实是没必要用的它们更适合那些目标函数不可导、搜索空间巨大、难以用梯度法求解的优化问题。也就是“黑盒优化”场景。另外强化学习算法在选择题里也出现了但考察的不是算法细节而是“在什么样的反馈条件下适合用强化学习”。答案是需要有延迟奖励、需要在序列决策中不断试错。这里也提醒了我笔试的算法岗不只考数据结构机器学习、深度学习、最优化理论的基本概念也要复习而且最好能理解算法之间的设计动机而不是只看名字。5. 答题策略复盘我的时间分配与决策逻辑5.1 理想的时间分配表两个半小时听起来不算少但四道编程题加一批选择题实际分配到每一题的时间并不宽裕。我事后整理了一下自己在考场上真实的时间消耗也标注了我认为更合理的分配方式题目/环节我的实际用时建议用时备注环境检查与登录调试8分钟5分钟提前做环境测试可压缩到3分钟选择题第一遍20分钟15分钟不会的题先标记不要恋战编程题第一题15分钟10分钟签到题应快速稳定拿下编程题第二题40分钟35分钟先想清楚转移再写代码编程题第三题35分钟30分钟如果卡住就考虑拿部分分编程题第四题25分钟30分钟做不出就写暴力剪枝检查与补漏7分钟15分钟至少通读一遍选择题这里最大的教训是我选择题第一遍花的时间太长了有几道题明明拿不准却反复纠结直接挤占了编程题的时间。后来我学乖了笔试中选择题和编程题的分值比例通常不是一半一半编程题才是大头所以在选择题上卡超过一分钟就应该标记跳过优先保证编程题有充分时间。5.2 卡题时的止损原则部分分优先于满分第三题我写到最后也没能完全AC但我做了几乎是最优的止损——我先写了一个复杂度O(n*m)的暴力匹配版本把样例全部跑通然后在这个基础上加了字符串哈希优化确保能过掉一部分大数据测试点。这样的好处是即使最终版本不能AC前面的部分分也能拿到手。考场上很多人容易陷入“想不出来就不写”的心理陷阱。实际上大型在线评测系统通常按测试点给分哪怕只过了一个测试点也有分。如果你完全空着那就是零分如果你写了一个暴力解法至少能拿到部分分。这个策略不仅适用于淘天对大多数大厂笔试都适用。5.3 选择题的排除法先算再猜别死磕选择题中有一道关于KMP next数组的题选项给的是字符串abacaba的next数组值。这种题如果你能手算next数组几秒钟就能搞定如果你不会手算那你只能一个一个选项去验证。我的建议是笔试前一定要亲手推两三个模式串的next数组把前缀函数的具体含义弄明白而不是只看代码。考场上是没有时间上网查的。还有一些概念型选择题即使你不知道正确答案也可以通过排除明显错误的干扰项来提高猜中率。比如有一道关于PID控制算法的题问增量式PID和位置式PID的区别我不知道细节但我知道“增量式输出的是控制量的增量”于是把“输出控制量绝对值”之类的选项全排除了最后猜中的概率变成了二选一。这种技巧在时间紧张的时候很管用。6. 复盘之后给下一批考生的准备清单6.1 刷题范围的优先级如果你离笔试还有两周以上我建议按照这个优先级来准备第一梯队是字符串匹配KMP、Z算法、哈希、动态规划背包、区间、树形、排序与稳定性第二梯队是图的遍历BFS/DFS、拓扑排序、并查集、最小生成树、最短路第三梯队才是机器学习算法的手推公式逻辑回归、SVM、决策树、ID3/C4.5和深度学习的基础理论。为什么要这样排因为编程题几乎绕不开前两类内容而选择题里的机器学习考点通常不会太深复习一遍核心概念就够。我说的“够”是指能判断使用场景而不是能手推反向传播。如果你目标是淘天算法岗数据结构与算法的基础比重比想象中大得多。6.2 容易被忽略但笔试常考的小知识点我从这次笔试里总结出几个容易忽略的点第一是树形DP的递归爆栈问题。遇到深度可能很大的树时要么用迭代栈要么用自底向上的拓扑序不要在考场上赌评测机的栈空间。第二是字符串匹配类题目中哈希碰撞的隐患。如果题目数据是随机的单哈希通常够用但如果出题人刻意构造数据单哈希很容易被卡。笔试中如果你不确定可以手写双哈希或者直接上Z算法。第三是二分查找的边界条件。很多动态规划优化题都要用到“在有序序列中找最后一个小于等于x的位置”这个用C的upper_bound/lower_bound一步搞定但很多人手写时容易把while (l r) 和 mid 的更新写错。建议提前把lower_bound和upper_bound在C里的返回值语义彻底搞清楚。6.3 考前一晚与考中环境检查的细节最后再说一些“非技术但很要命”的细节。考前一晚不要通宵刷题尤其是不要临时学新算法因为一旦发现自己不懂会非常焦虑。我笔试前一晚在复习扩展KMP结果发现没完全吃透一晚上都没睡好第二天状态明显受影响。笔试当天提前30分钟进入线上房间把浏览器、编译环境、输入法都试一遍。我用的是牛客系统建议提前在牛客的模拟环境里跑一个“hello world”程序确认代码能正常编译运行。如果你的电脑会有弹窗或者后台自动更新提前关掉防止笔试过程中弹窗打断答题。还有一点比较实用把常用的代码模板先写在本地编辑器里比如快读快写、并查集、树的前中后序遍历、二分查找、KMP的next数组构建、大整数模板。笔试时如果你发现题目涉及图论或字符串可以直接把模板贴进编辑器再开始改而不是从零敲起。这样能省下不少时间。6.4 心态调节笔试不是终点是一块试金石我个人觉得大厂笔试最难的不是题目本身而是在限时、监控、焦虑的多重压力下一直保持清晰思考。第三题卡住的时候我一度想起身去倒水但最终强迫自己把注意力转移到“拿部分分”这个目标上反而稳住了心态。如果你在笔试中遇到不会的题一定不要慌。你要知道同一场笔试中绝大多数人也不会做。你的目标不是满分而是超过同批次的其他候选人。能稳定AC两道半的人已经超过了不少竞争者。很多时候决定你能不能拿到面试机会的不是你最强的那道题做得有多快而是你最弱的那道题有没有拿到足够多的部分分。写在最后这一场笔试教给我的三件事先说第一件事算法岗笔试从来没有“背得多就能过”这回事。我在准备阶段花了很多时间背机器学习概念和深度学习模型的细节结果真正拉开分差的反而是KMP的next数组有没有真正理解、树形DP能不能应付爆栈、二分查找能不能在不同场景下灵活迁移。这些听起来很基础的东西恰恰是考场上最容易掉链子的地方。第二件事做题顺序和止损能力比做题能力更重要。如果我在选择题上不纠结那两道拿不准的题把时间留给第三题也许能多过几个测试点。笔试也讲究策略它不是一场纯粹的知识测试而是一场限时资源调配测试。第三件事复盘比刷题更值钱。这场笔试结束后我花了整整一天把每道题重新写了一遍并把扩展KMP、Z算法这些之前没有吃透的内容补上了。后来我在其他厂的笔试里又遇到了类似的字符串匹配题明显从容了很多。笔试不是考完就没用了它其实是免费的全真模拟是你查漏补缺的最好素材。如果你也正在准备算法岗的秋招笔试希望我这份复盘能给你一些参考。别怕题难也别怕题量多真正决定结果的往往是你有没有提前把基础打牢以及考场上能不能冷静地做出取舍。祝你好运。