
每年这个时间点都会有大量同学在牛客网讨论区刷到“网易2020校招笔试-算法通用正式批”这个标题然后一脸迷茫地问“算法通用到底是哪个岗位考什么我该复习什么”作为经历过那一年笔试的过来人我想把这场考试从题目类型到备考思路完整拆一遍。这篇文章不是官方解析但我尽量把当时真实考场上的体验、坑和值得反复练的算法方向都讲透希望能帮后来准备算法岗笔试的同学少走弯路。先说结论网易2020校招笔试的“算法通用”岗考察的不是某一个细分方向而是算法工程师最底层的通用能力——数据结构与算法、机器学习基础、概率统计和编码基本功。它的笔试风格和LeetCode不完全一样更像是一套“大杂烩”选择题覆盖面极广编程题难度有梯度如果你只刷题不补基础很容易在选择题上栽跟头。1. 先把这个考试摸透网易算法通用笔试到底考什么1.1 笔试结构与时间分配题量比你想象的大网易2020校招正式批的算法通用笔试是在牛客网线上完成的整体题型分两大类单选题和多选题占一部分编程题占一部分。我印象中选择题量在20道上下编程题3到4道总时长90到120分钟。这个时间和题量放在一起其实是比较紧张的。很多第一次参加笔试的同学容易犯一个错误看见选择题就慢慢琢磨结果编程题时间不够。以我当时的情况为例前面20道选择题如果每题花超过3分钟后面编程题就很难静下心写。比较合理的分配是选择题控制在40分钟左右剩下至少50分钟给编程题。编程题里先做有思路的别在一道题上死磕超过20分钟。选择题的考察范围非常杂包括但不限于数据结构基本操作的时间复杂度、排序算法的稳定性与比较次数、操作系统进程线程、网络协议、概率论与数理统计、机器学习基础概念过拟合、正则化、交叉验证等、深度学习基础激活函数、梯度消失、反向传播。换句话说这不仅是算法题还夹杂了大量计算机基础和AI基础知识的考察。1.2 考察范围画像从数据结构到机器学习的一锅端我当年考完出来第一反应是这简直是把大学四年专业课浓缩成了一套卷子。数据结构、算法设计与分析、概率论、机器学习、深度学习、操作系统、计算机网络甚至还有一点数据库知识。这与纯互联网研发岗的笔试有明显区别算法岗位更看重数学功底和对模型原理的理解。这里给一个比较清晰的画像数据结构与算法排序、链表、二叉树、图论、动态规划、贪心、字符串匹配。机器学习与深度学习损失函数、梯度下降、决策树、SVM、KNN、神经网络结构、卷积与池化、激活函数。数学基础概率分布、期望与方差、贝叶斯公式、最大似然估计、矩阵特征值。计算机基础进程与线程、TCP/UDP、内存管理、数据库索引。说实话“算法通用”四个字不是谦虚是真的通用。你无法只靠熟刷某一类题目就稳过必须有一个系统性的知识框架。2. 核心考点拆解真正拉开差距的几类算法2.1 数据结构与排序笔试的“基本功测试区”排序算法是笔试选择题的重灾区也是编程题里经常作为前置步骤的知识点。网易的算法笔试对排序的考察不会停留在“快排时间复杂度是多少”这种表面问题而是会深挖到具体场景下的选择。比如它可能会问对于一个基本有序的数组哪种排序算法效率最高这时候插入排序常常优于快排因为接近有序时插入排序的比较和移动次数很少时间复杂度接近O(n)。再比如稳定性问题选择排序是不稳定的快排也是不稳定的归并排序是稳定的堆排序也是不稳定的。这里有个容易混淆的点堆排序为什么不稳定因为堆调整过程中相同值的元素可能被交换到不同位置。举个简单例子数组中有两个相同值建堆和调整过程中它们的相对顺序可能改变所以不稳定。如果你要复习排序我建议把所有常见排序的核心思路、时间复杂度最好、最坏、平均、空间复杂度、稳定性做成一张表。我当时就是靠这张表应付了大半选择题。笔试中还会问堆排序的建堆过程、快排的partition操作等这些在牛客网的题库里都有大量练习。对于编程题C选手要熟练使用STL中的sort、priority_queue等容器这不仅是省时间的问题更是降低出错率的关键。手写快排在笔试场景下其实不太必要除非题目明确要求实现某个排序算法本身。我见过有同学在编程题里手写堆排序结果一个边界条件写错调试花了大半天非常亏。2.2 字符串处理与KMP一类被低估的高频题字符串类题目在网易算法笔试中出现的频率相当高但很多人容易忽略觉得不就是遍历拼接吗实际上字符串匹配、子串查找这类题一旦数据量上来暴力解法是过不了的。这就引出了KMP算法。KMP算法是关于模式串匹配的经典算法核心是next数组。题目里经常给一个模式串比如pabacaba让你求next数组。next[i]的定义通常是在第i个字符之前的子串中最长相等前缀和后缀的长度。我们来手动算一遍next[0] -1有的教材定义为0两种定义都有人用做题时先确认题目约定。next[1] 0因为p[0]前面没有子串。next[2] 0p[1]前面的子串是a没有相等前后缀。next[3] 1p[2]前面的子串是ab前缀a和后缀b不相等但前缀a和后缀a注意这里看的是p[0..1]ab最长相等前后缀长度为0。等一下我重新算。实际上next数组根据定义不同有细微差别有的教材next[i]表示i位置失配后跳转的位置有的表示最长相等前后缀长度。以“p前面子串的最长相等前后缀长度”这一定义为例pabacabanext[0] -1或0约定不同。i1看p[0]a前面没有子串最长相等前后缀为0所以next[1]0。i2看p[0..1]ab前缀a后缀b不相等next[2]0。i3看p[0..2]aba最长相等前后缀是a和a长度为1next[3]1。i4看p[0..3]abac没有相等前后缀next[4]0。i5看p[0..4]abaca前缀a等于后缀a长度1再试ab和ca不相等所以next[5]1。i6看p[0..5]abacab前缀ab等于后缀ab长度2所以next[6]2。i7看p[0..6]abacaba最长相等前后缀是aba长度3所以next[7]3。这样算下来pabacaba的next数组按最长相等前后缀长度的定义为[0,0,0,1,0,1,2,3]第一位0表示空串。如果题目定义next[i]表示失配时跳转的索引一般会整体左移或整体减一所以刷题时一定先看清题目给的约定。KMP的核心思想是当匹配失败时不回溯主串指针而是利用next数组把模式串向右滑动尽可能远的距离。这个“跳”的过程把暴力匹配的O(m*n)优化到了O(mn)。笔试中除了KMP偶尔也会出现BM算法后缀匹配的思想、字符串哈希等但频率远低于KMP。对于备考我的建议是KMP不只是会背模板而是能手推next数组。因为选择题里经常出现“给一个模式串求next数组”这种题你只要会手推就能秒杀编程题里再背板子双保险。2.3 动态规划与贪心笔试编程题的“半壁江山”如果给网易算法笔试编程题难度排个序动态规划DP绝对排在前面。几乎每年都会有一道DP题有时候是两道。常见类型包括最长递增子序列LIS、最长公共子序列LCS、背包问题、编辑距离、区间DP等。这些题在LeetCode和牛客网都有大量原题变体一定要练到熟练。动态规划的核心就三步定义状态、写出状态转移方程、确定初始化和遍历顺序。拿最长递增子序列举例dp[i]表示以第i个元素结尾的最长递增子序列长度转移方程是dp[i] max(dp[j] 1)其中j i且nums[j] nums[i]。这个思路简单但笔试里如果要考优化版本会用贪心加二分把复杂度降到O(n log n)这时候dp数组变成“长度为i的递增子序列的最小末尾值”思路完全不同。贪心算法在笔试中往往作为简单题出现但“简单”是相对的。经典的区间调度问题、跳跃游戏、分发饼干等都是贪心题。贪心需要证明局部最优能推出全局最优但笔试时一般不要求写证明你只需要敢猜、会验证。我的经验是如果一道题看起来可以用DP但你暂时推不出状态转移方程不妨先试试贪心能不能过样例。笔试数据往往有不少特殊情况能过样例的解法至少能拿部分分。另外网易笔试里还出现过一些“看起来像数学题实际上需要模拟或二分”的题目。比如给定一个数组要求最小化最大值或最大化最小值这类题十有八九是二分答案加检查函数。这种思想一定要练熟因为它在选择题里也会考只是换了一种文字形式。2.4 图论与搜索Dijkstra只是起点图论在网易算法通用笔试中频率不如DP高但一旦出现往往是区分度较高的题。常见考点有最短路径Dijkstra、Floyd、最小生成树Kruskal、Prim、拓扑排序、并查集、二分图匹配等。Dijkstra是必会的尤其是用优先队列优化的版本。笔试题里如果出现单源最短路径数据量稍大就必须用堆优化否则超时。它的核心思想是每次从堆里取出当前距离最小的未访问节点用它去松弛相邻节点。这个“松弛”操作听着抽象但类比一下就很清楚你有几条从家到火车站的路某条路中途经过一个商场商场到火车站更近于是你从家先到商场再从商场到火车站总距离更短这就叫松弛。二分图匹配的HK算法Hopcroft-Karp算法在笔试中出现频率不高但偶尔会作为拔高题尤其是涉及任务分配、课程安排这类场景。HK算法比匈牙利算法更快核心是用BFS分层、DFS增广复杂度O(E*sqrt(V))。如果时间紧张我个人建议先把匈牙利算法掌握HK算法只要明白思路即可因为笔试现场能写出匈牙利已经很加分了。搜索方面DFS和BFS是基础中的基础但笔试考的往往不再是裸的网格寻路而是结合状态压缩的BFS或者带剪枝的DFS。比如八数码问题、迷宫最短路径加钥匙等状态可能非常复杂这时候需要给状态设计一个哈希方式甚至用A*搜索。这类题短期内不容易真正掌握但至少要知道常见套路。3. 经典题型与实战思路像做真题一样过一遍3.1 一道DP题的完整推导过程我们来过一道类似网易笔试风格的动态规划题题目大意是一个机器人从左上角走到右下角每次只能向右或向下走网格中有一些障碍物问有多少条不同路径。这就是带障碍的路径计数问题。状态定义dp[i][j]表示从起点走到(i,j)的路径数。 初始化dp[0][0] 1如果起点或终点是障碍直接返回0。 转移方程if (grid[i][j] 障碍) dp[i][j]0else dp[i][j] dp[i-1][j] dp[i][j-1]注意边界条件。 遍历顺序按行从上到下按列从左到右。这道题在LeetCode上是62和63题看起来简单但在笔试题里它可能被包装成“机器人走网格收集金币”之类的场景甚至加上“最多经过k个障碍”的限制就变成了三维DP。所以不要只背题要理解状态设计的方法需要记录哪些信息就多开一维维度。网易笔试题里还有一种常见DP区间DP。比如给定一个字符串求最长回文子序列长度。状态dp[i][j]表示s[i..j]的最长回文子序列长度如果s[i]s[j]则dp[i][j]dp[i1][j-1]2否则dp[i][j]max(dp[i1][j], dp[i][j-1])。这种题写起来不难关键是遍历顺序要由短区间到长区间很多人在这里犯错导致答案不对。3.2 图论最短路从暴力到堆优化再来看一道类似笔试风格的图论题给定一个有向图节点数n最多10万边数m最多30万求从节点1到节点n的最短路径。如果直接使用O(n^2)的朴素Dijkstran10万时复杂度是10^10完全不可行。这时候必须用优先队列优化也就是每次取出距离最小的节点复杂度降到O(m log n)也就是30万乘17大约500万次操作可以接受。写堆优化的Dijkstra要注意几个坑用pairint,int存(dist, node)放进优先队列时默认是大顶堆所以要用greaterpairint,int或者存入负距离。已经确定最短路的节点从堆里弹出时检查vis数组不能再次被使用否则死循环。邻接表用vectorvectorpairint,int存储注意编号从0开始还是从1开始代码里保持一致。我当年笔试时最常犯的错是把node和dist的顺序写反导致排序逻辑完全错误。这种低级错误非常打击心态所以建议大家在笔试前把Dijkstra的模板固定在编辑器里多敲几遍形成肌肉记忆。3.3 机器学习相关选择题不只是“背概念”之前我提到选择题会涉及机器学习这里展开来说。网易算法通用笔试对机器学习的考察不会简单到只问“什么是过拟合”而是会给你一个具体场景让你判断该用哪种方法。比如它可能会描述训练集准确率高验证集准确率低问解决办法有哪些。正确答案通常是正则化、数据增强、Dropout、早停等而“增加模型层数”往往是错误选项。关于聚类算法K-Means是高频考点。你得知道K-Means的步骤初始化K个质心分配样本到最近质心更新质心为簇内均值重复直到收敛。它容易受初始质心影响所以有K-Means来做改进。选择题里可能会问K-Means的优缺点比如它对离群点敏感、需要预先指定K值、适用于凸簇等等。这些如果只靠背题容易记混建议自己动手用sklearn跑一遍印象会深很多。深度学习基础也是选择题热区重点包括激活函数ReLU、sigmoid、tanh的特性与梯度消失的关系、损失函数交叉熵、均方误差的适用场景、卷积层的感受野计算、池化的作用降维、防止过拟合、平移不变性。感受野的计算公式是RF RF (kernel_size - 1) * stride累加这个在选择题里经常出现虽然题干有时候看起来复杂但实际操作起来就是一两个公式。3.4 数值与优化类算法看懂原理能选对答案近几年笔试选择题里像模拟退火、粒子群算法、PID控制这类优化算法的出现频率也在上升。它们不算机器学习核心但代表了“算法工程师的知识广度”。比如模拟退火算法的核心是以一定概率接受比当前解更差的解这个概率随温度降低而减小目的是跳出局部最优。粒子群算法的核心是每个粒子根据个体历史最优和群体历史最优来更新速度与位置。这些算法在代码题里几乎不会让你实现但选择题里可能给你一段伪代码让你判断它描述的是哪个算法。对于这类内容我的建议是不要看得太深因为你不可能在笔试前把每个算法的细节都实现一遍。你只需要抓住每个算法的核心思想、两个关键参数、典型应用场景然后做题时靠关键词进行匹配。比如看到“温度”“退火”“概率接受”就是模拟退火看到“粒子”“速度”“个体最优”“全局最优”就是粒子群看到“比例”“积分”“微分”三个词就是PID。这种对应关系一旦建立选择题基本不会丢分。4. 笔试环境的实战经验会做题和拿高分是两回事4.1 在线笔试的输入输出是隐藏陷阱很多第一次参加线上笔试的人都会遇到一个尴尬情况本地跑得好好的一提交就是编译错误或答案错误。原因多半出在输入输出上。牛客网的在线评测系统对读入有多组测试用例的情况通常要求程序循环读取而不是只读一次。比如#include bits/stdc.h using namespace std; int main() { int n; while (cin n) { // 每一组数据分别处理 vectorint nums(n); for (int i 0; i n; i) cin nums[i]; // 输出结果换行 cout solve(nums) endl; } return 0; }如果你习惯了LeetCode的函数式提交可能需要一个适应过程。我的经验是在笔试前专门在牛客网练几道需要处理输入输出的题比如“计算ab”系列把循环读入和字符串分割的写法练熟避免到考场上临时翻语法。另外数据范围直接决定你是否要用long long。如果题目给你1e9级别的整数并让你求和int会溢出必须用long long。还有如果题目要求的精度较高涉及浮点数比较一定要使用eps比如if (abs(a-b) 1e-9)。这些都是笔试现场很常见的隐藏扣分点。4.2 做题顺序与时间管理先拿稳分再啃硬骨头笔试时间有限一定要有明确的策略。我当时给自己定的做题顺序是先快速浏览所有编程题挑出最简单的一道先做再按从易到难的顺序解决。原因很简单按顺序做时遇到一道难题卡住20分钟后面简单题时间不够最容易导致低分。具体来说编程题里通常有一道题是“数据结构基础题”比如数组处理、栈模拟、队列应用这种题代码量不长逻辑直接应该先做。第二优先的是动态规划题前提是你对状态转移有思路。最后才是大模拟、搜索或图论难题。举例说明一道题如果读完题10秒内没有找到DP状态定义那就先跳过继续看后面的题等全部题目都有思路了再回头来啃。选择题的时间管理也一样。不要在一道概率计算题上花10分钟算不出来就蒙一个标记一下有时间再回来看。考试看的是总分不是单题得分率。4.3 代码规范与调试技巧提交前这几步救过我好几次笔试代码虽然不要求工程级规范但清晰的命名能让自己的思路更顺。我建议变量名用有意义的英文比如dp、cnt、visited而不是a、b、c。另外在编程题里加上必要的注释不仅能帮你整理思路在检查时也能快速找到逻辑关键点。调试方面写完代码后先自己构造几个测试用例。常见的测试包括最小输入n1、边界值空数组、全是重复元素、极限规模n10万时能否在时间内跑完。如果本地测试通过但提交失败优先检查下标越界和初始化问题尤其是DP数组的边界、优先队列的重复push、全局变量是否被多组测试用例清空等。还有一个很实用的技巧如果题目允许提交前在代码里加一些临时输出把中间结果打印出来观察是否符合预期确认后再删掉。但注意线上测评不会等你的print输出也不会因为你多打印一行而放你一马所以这些调试输出在最终提交前一定删除干净。5. 常见问题与避坑指南5.1 备考期间常见的“无效努力”有些同学在备考算法笔试时陷入一个误区只刷LeetCode高频题忽略了基础概念。但网易算法通用笔试的选择题覆盖面广如果只看算法题容易在机器学习、概率统计、计算机基础上吃亏。我认识一个朋友LeetCode刷了400多道结果选择题大面积不会编程题也并不是全对最后笔试排名并不理想。所以备考策略应该是“算法题打底基础概念铺面”。另一个不太好的习惯是只做简单/中等题从来不碰困难题。笔试确实以中等为主但网易偶尔会在最后一题放一道困难级别。如果你从未写过困难题考试时面对陌生题型会非常慌。建议每周至少挑战2到3道困难题而且重点看思路而不是只求AC。还有一点不要只背模板不手动推演。KMP的next数组、堆排序的调整过程、Dijkstra的松弛过程这些光看根本记不住必须自己在纸上推导几遍。尤其是KMP考试选择题能给模式串让你求next数组这种题属于送分题前提是你真的会推而不是只会用板子。5.2 笔试现场突发状况的处理线上笔试最常见的突发状况就是断电、断网或者系统卡顿。我的建议是提前把自己所在的网络环境测试一遍最好用有线网络同时准备一个备用热点。一旦出现断网第一时间截图并联系招聘HR说明情况一般都会有补考或延长处理但前提是你能提供证据。另外浏览器弹窗、输入法自动切换也容易影响打字。建议使用牛客网推荐的浏览器关闭无关插件输入法切换到英文模式省去切换麻烦。编程题使用本地IDE时注意代码中不要包含本地路径的头文件比如#include D:\myheader.h否则线上编译直接失败。这个错误我记得有人真犯过。笔试现场如果遇到一个题目读了三遍仍没有思路果断放弃去做后面的题。不要因为一道题影响整体节奏。我当年就有一道图论题完全没头绪直接跳过最后时间用在做其他题上反而拿到了相对不错的分数。5.3 关于“算法通用”岗位方向的补充认知网易的算法岗位内部细分为很多方向比如推荐算法、NLP算法、计算机视觉算法、数据挖掘等。但校招笔试阶段统一叫“算法通用”意味着你要在一个卷子里同时面对各路方向的考察。对于有明确方向的同学来说这是一种挑战因为你的复习范围会扩大但同时也是机会——你可以用通用基础能力来展现自己的潜力。对于投递“算法通用”岗的同学我的建议是不要过早放弃任何一块知识。不要因为你是搞CV的就完全不看NLP的基础也不要因为你是做推荐的就跳过图像处理。笔试阶段考察的核心是“是否具备算法工程师的基本素养”这个素养体现在数据结构、算法设计、机器学习和代码能力四个方面。当你拿到offer之后部门才会根据你的方向和兴趣进一步细分工作内容。从长远来看这套笔试内容与行业中大多数互联网公司算法岗笔试高度重合所以认真准备这场考试的价值不仅仅是一次笔试更是对整个算法知识体系的系统复习。哪怕最后没有拿到网易offer这套知识也完全可以复用到其他公司的笔试面试中。5.4 考场之外一轮笔试不能定义你的能力最后说一点心理层面的经验。笔试成绩很重要但它不能完全定义你的算法能力和未来潜力。我见过笔试成绩一般但在面试环节表现极其出色的同学也见过笔试高分却在面试中因为沟通和项目经验不足而失利的例子。网易的校招流程是笔试、面试多轮综合评估笔试只是入场券。所以如果你没做好某一道题或者某一部分选择题实在不会蒙了答案不要太纠结。把每一场笔试都当作一次查漏补缺的机会考完之后立刻记录自己不会的知识点然后针对性复习这才是笔试的正确打法。我个人体会是校招笔试到后期越早经历越占便宜因为每个公司考来考去核心考点就那些前期积累的经验可以直接迁移。如果时间允许我还推荐大家在牛客网把网易历年的笔试真题都过一遍尤其是近两年的。真题的价值在于让你熟悉出题风格、题量分布和难度梯度。刷完真题看解析时不仅要看正确做法还要思考命题人为什么要出这道题他想考察什么能力。这种“向上思考”的方式能让你的备考效率提升不少。