
1. 笔试整体感知这轮网易算法笔试题到底在考什么每年八月底到九月初是互联网大厂校招笔试最密集的时段。网易2023校招算法工程师的正式第一批笔试作为秋招的第一波硬仗网上讨论热度一直很高。我身边不少同学考完出来就感叹题量不小、时间紧张、ACM风格明显。这篇文章不聊虚的直接把这场笔试的题型分布、核心考点、解题思路和复盘心得一次性讲透给后面备考的同学一个参考坐标。先说说整体感受。正式第一批的笔试时长一般是两小时左右题量在四道编程题上下浮动偶尔会穿插一两道选择题或简答题但主力还是算法编程题。难度梯度设计得比较明显前一两道属于热身题考察基本数据结构和编码能力后两道直接上强度涉及动态规划、图论、贪心策略等进阶内容区分度很高。换句话说这套卷子不是为了让你拿满分而是为了在短时间内把候选人的算法功底、代码实现速度和思维缜密度拉出层次。如果你是准备投递大厂算法岗的应届生或者正在刷题准备秋招这篇文章能帮你少走不少弯路。我会从题型设计逻辑、典型真题拆解、常见失分点、以及笔试后的复盘方法几个维度展开尽量做到考完就能用。2. 题型设计与考点分布为什么网易偏爱这些算法2.1 题目结构从签到题到压轴题的难度跃迁网易的算法笔试题型设计基本遵循一个3-2-1的节奏。三道中等题保底两道偏难题拉开差距一道压轴题决定你是否能进入下一轮。前两道题通常考察数组操作、字符串处理、模拟、排序等基础能力只要代码功底扎实、思路清晰30分钟内解决不是问题。中间两道题开始加入思维含量常见的是贪心策略、二分答案、前缀和优化、双指针滑动窗口这类需要想明白才能写对的题目。最后一道题往往是动态规划或图论的综合应用状态设计、转移方程、边界条件、复杂度优化缺一不可真正考察硬实力。这个设计逻辑和网易的业务场景密切相关。作为一家同时拥有游戏、音乐、电商、教育多条产品线的公司算法工程师在实际工作中面对的问题往往不是纯粹的刷题题而是带有明确业务约束的优化问题。比如游戏中的匹配系统、推荐系统的排序策略、反作弊的异常检测都需要候选人在有限条件下快速建模、高效求解。笔试题目设置的难度梯度本质上就是在模拟这种从简单到复杂、从局部到全局的工程思维。2.2 高频考点动态规划、图论、贪心、字符串处理结合近两年的笔试回忆和各大平台的讨论帖网易算法笔试的高频考点可以归纳为四类。第一类是动态规划出镜率最高。背包问题、最长上升子序列、区间DP、状态压缩DP都有可能出现而且往往不是裸题会套一层业务场景的外壳。第二类是图论算法Dijkstra最短路、最小生成树、拓扑排序、二分图匹配等经典算法需要熟练掌握尤其是建图能力和对边权、点权的处理能力。第三类是贪心策略这类题看起来简单但要证明贪心正确性并不容易需要通过排序不等式、交换论证等方式严谨推导。第四类是字符串处理KMP算法的next数组、Trie树、字符串哈希、回文串相关算法经常作为考点出现我在热词里看到在kmp算法中对于模式串pabacaba其next数组这条搜索热度很高说明这确实是考生普遍关注的难点。除了编程题部分批次的笔试还会包含一些机器学习/深度学习的基础题比如手写IoU计算、讲解BatchNorm的原理、分析过拟合的解决办法等。这些内容占比不高但往往是简历上有相关项目经历的候选人必拿分的环节。我把这类题目归为履历验证题考察的是你有没有真正做过项目、理解背后的数学原理而不是只会调包调参。2.3 时间分配策略两小时如何安排最合理两小时四道题看起来每道题30分钟实际执行下来完全不是这么回事。我的建议是前紧后松、留足缓冲。前两道基础题每道控制在15到20分钟内完成包括读题、思考、编码、自测。这两道题的正确率必须保证100%因为它们是基本盘决定你能不能拿到及格线以上的分数。中间两道题每道留25到30分钟先花5分钟想清楚思路再动手宁可多想一会儿也别急着写废代码。最后一道压轴题如果读完题5分钟内完全没有思路果断先做部分分。所谓部分分就是通过暴力枚举、朴素DP等方式拿到一定比例的测试用例通过在笔试评分中部分通过也是有分数的而且往往比你死磕一道题卡到最后要划算得多。另外网易的笔试平台一般支持本地IDE调试和在线评测相结合的模式。我强烈建议在本地IDE中写代码、跑样例确认无误后再粘贴到在线编辑器提交。这样不仅能利用本地环境的调试工具还能避免在线编辑器卡顿带来的时间浪费。3. 核心算法原理解析与考场实战要点3.1 KMP算法next数组的推导才是关键KMP算法在热词里被反复提及模式串abacaba的next数组计算更是高频讨论点。很多同学刷题时对KMP的理解停留在背模板阶段一旦题目稍作变形就不知道怎么应用。实际上KMP的核心价值在于利用已匹配的信息避免主串指针的回退将时间复杂度从暴力匹配的O(n*m)降到O(nm)。next数组的定义要理解透彻next[i]表示模式串P[0...i-1]即前i个字符组成的子串中最长的相同真前缀和后缀的长度。注意是真前缀和真后缀不能是整个子串本身。计算next数组时使用递推的方式从i1开始逐个求解。当P[i]和P[j]相等时next[i1] j1当不相等时j需要回退到next[j]继续比较直到j0或P[i]和P[j]相等为止。以abacaba为例逐位推导next[0] -1有些教材定义为0取决于实现习惯next[1] 0因为子串a没有真前缀和真后缀next[2] 0子串ab没有相同的真前后缀next[3] 1子串aba的真前缀a和真后缀a相同next[4] 1子串abac的真前缀a和真后缀c不同长度为1的前缀a和长度为1的后缀c不匹配只有长度为0的情况成立next[5] 2子串abaca的真前缀ab和真后缀ca不同但长度为1的前缀a和后缀a相同继续检验长度2前缀ab和后缀ca不同所以最长长度为1这里需要仔细推导等等我上面这一段的推导有点问题实际计算时应该使用递推不能靠肉眼观察。我在考场上就是吃了这个亏肉眼推导容易出错。正确的做法是用j next[i]的递推思想逐位求解。感兴趣的同学可以拿纸笔按这个思路推一遍会收获很大。考场要点KMP考得多的不仅是next数组计算还有在字符串中查找模式串出现位置/次数的变形题。比如找出所有匹配位置并处理重叠情况这时候需要理解匹配完成后j next[j]的回退逻辑。另外有些题目会考察KMP的拓展应用比如求字符串的最短循环节这需要用到一个结论如果n % (n - next[n]) 0则最小循环节长度为n - next[n]。这个结论在网易笔试中直接出现过务必牢记。3.2 贪心算法证明比实现更重要贪心算法是网易笔试的常客但也是最容易感觉对了但实际错了的题型。贪心的核心在于每一步都做出当前看起来最优的选择并希望通过局部最优达到全局最优。但并非所有问题都满足这个性质所以写代码之前必须先证明贪心策略的正确性。常见的证明方法有交换论证、数学归纳法和范围缩减法。交换论证是使用最频繁的一种思路是假设存在一个最优解和贪心解不同通过交换最优解中的某些元素不降低解的质量从而证明贪心解也是最优解。举个例子经典的活动安排问题给定若干个区间选择尽可能多的不重叠区间。贪心策略是按结束时间排序优先选择结束时间最早的区间。这个策略的正确性证明是这样的对于任意一个最优解如果它选择的第一个区间不是结束时间最早的区间那么用结束时间最早的区间去替换它不会影响后续区间的选择而且留下的空间更大。通过这种交换可以一步步把最优解转化为贪心解因此贪心策略成立。网易笔试中贪心题常见的场景有最小化最大等待时间、任务调度、区间覆盖、跳跃游戏等。遇到这类题我建议先写一个暴力解法用于验证小规模数据再实现贪心解法在本地对拍测试。虽然笔试时间紧张但花5分钟做这个小验证非常值得能帮你避免思路错了整份代码白写的尴尬。3.3 图论算法Dijkstra与建图技巧图论题在网易笔试中出现的频率相当高。Dijkstra算法刷题时最常遇到的问题是为什么不能用SPFA和Dijkstra能不能处理负权边。前者在网络流和竞赛圈有争议但在笔试场景下无负权图就用堆优化的Dijkstra时间复杂度O((VE)logV)这是最稳妥的方案。后者答案很明确不能。Dijkstra基于贪心思想一旦确定了某个节点的最短距离就不再更新如果有负权边这个贪心性质会被破坏。所以遇到负权图改用SPFA或Floyd、Bellman-Ford。建图是很多同学的薄弱环节。笔试题目通常不会直接告诉你这是一道最短路问题而是套一个业务场景比如从城市A到城市B的最少中转次数在n个节点之间选择最优路径使得总油耗最低。这时候需要自己把场景转化为图节点是什么、边是什么、边权是什么、是有向图还是无向图、是否需要拆点、是否需要添加超级源点/汇点。建图能力只能靠多做题积累没有捷径。另外网格类的最短路径问题如迷宫最短步数建议用BFS而不是Dijkstra因为BFS在无权图中的时间复杂度更低。如果每一步的代价不同比如平地代价1、沼泽代价3才需要Dijkstra或0-1 BFS。网易笔试经常在网格地图上出题这个区分点一定要掌握。3.4 动态规划状态设计是灵魂动态规划是网易笔试压轴题的最爱也是区分度最大的一个考点。很多同学卡在不知道dp数组的含义是什么不知道怎么列转移方程这两个问题上。我的经验是动态规划的状态设计要遵循能覆盖所有情况、不重复、方便转移三个原则。具体来说先明确题目要求的是什么——最大值、最小值、方案数、可行性再思考影响答案的变量有哪些——位置、前一个选了什么、剩余容量、已经用了多少个这些变量就是dp数组的维度。以常见的背包问题为例0-1背包的dp[i][j]表示前i个物品在容量为j的背包中能获得的最大价值转移方程是dp[i][j] max(dp[i-1][j], dp[i-1][j-w[i]] v[i])。完全背包和多重背包在转移上略有不同核心是遍历顺序的区别。为什么0-1背包要倒序遍历容量、完全背包要正序遍历因为正序遍历会导致同一个物品被重复选取正好符合完全背包无限取的特性。这个细节笔试中经常考。状态压缩DP是另一个可能出现的难点尤其是当题目给出的n很小通常n20时可以考虑用二进制位表示状态。比如旅行商问题TSP中dp[mask][i]表示已经访问过的城市集合为mask、当前所在城市为i时的最短路径长度。状态转移时枚举下一个要访问的城市j如果j不在mask中则dp[mask|(1j)][j] min(dp[mask|(1j)][j], dp[mask][i] dist[i][j])。这种题目一旦出现往往是压轴题能写出来的人寥寥无几但写出来就基本锁定晋级名额。3.5 排序算法与数据结构基础中的基础排序算法是笔试中的隐形考点它很少直接作为一道独立题出现但几乎每道题都离不开它。快速排序的平均时间复杂度O(nlogn)、最坏情况O(n^2)以及如何避免最坏情况随机选取pivot/三数取中归并排序的稳定性和用于求解逆序对问题的技巧堆排序的建堆和调整过程都可能是选择题或代码题的考察点。在热词中看到冒泡排序算法c堆排序算法这样的高频搜索说明很多同学对排序的实现细节还不够熟练。我的建议是快排、归并、堆排三种O(nlogn)的排序算法必须能手写出来而且能够分析各自的优缺点和适用场景。C中sort()函数内部结合了快排、插入排序和堆排序视数据量而定Java的Arrays.sort()对基本类型使用双轴快排、对对象类型使用归并排序保证稳定性。这些工程细节在笔试中偶尔会以选择题形式出现。数据结构方面并查集、堆、单调栈、线段树、树状数组是高频考点。特别是并查集路径压缩按秩合并的复杂度接近于O(alpha(n))几乎可以视为常数时间。笔试中经常出现判断两个节点是否连通统计连通分量个数检测图中是否有环等题目都可以用并查集快速解决。单调栈的经典应用是求下一个更大元素和柱状图中最大的矩形这两种题型在网易的笔试讨论帖中出现过不止一次。4. 解题策略与代码实现的实战技巧4.1 审题与样例分析别急着动手写代码我见过太多同学拿到题目扫一眼就开写写到一半发现理解错了题目意思浪费大量时间。正确做法是先把题目完整读两遍圈出关键约束条件数据范围、时间限制、空间限制、输入输出格式再手动模拟一遍题目给出的示例确保自己理解的和出题人想表达的一致。数据范围是一个非常关键的信号。n10^5意味着你需要O(nlogn)甚至O(n)的算法n10^3意味着O(n^2)的算法可以接受n20基本就是状态压缩DP或搜索的节奏。我通常会在读题后立刻判断这道题最暴力的解法复杂度是多少能不能过如果可以过就直接暴力拿分如果不行再想优化。这种暴力先行的策略在笔试中非常实用尤其是在时间紧张的情况下。4.2 部分分策略暴力解法也能拿50%以上的分网易的在线评测系统一般会对每个测试点单独计分。如果你只能写出暴力解法很可能通过60%左右的测试用例拿到一个及格的分数。不要小看这部分得分在很多候选人因为一道题卡死而交白卷的背景下每道题都能跑出结果本身就是巨大优势。举个例子如果一道动态规划题你想不到状态定义但n的数据范围允许O(2^n*n)的暴力枚举那就直接DFS搜索所有方案取最优值。虽然过不了大数据但小数据能全对。很多同学总觉得暴力不是算法写出来丢人这是完全错误的心态。笔试的目的不是展示优雅的代码而是在有限时间内拿到尽可能多的分数。4.3 C还是Python考场语言选型建议网易笔试官方一般支持C、Java、Python等主流语言。我的建议是如果你实力允许优先选C。原因是一方面C在算法竞赛中的生态最完善很多经典模板可以直接用STL中的vector、map、set、priority_queue、unordered_map能大幅减少编码量另一方面网易的部分题目对常数时间要求较高C的执行效率是Python无法比拟的。但也别盲目跟风如果你平时刷题用的是Python对Python的语法和数据结构已经形成了肌肉记忆那就在考场上用Python。临场换语言是大忌。使用Python的同学要特别注意输入输出的效率尽量使用sys.stdin.buffer.read()一次性读入数据避免使用input()逐行读入尤其是循环次数上万时input()的效率会成为性能瓶颈。输出同样使用sys.stdout.write()拼接字符串。4.4 本地调试技巧造数据、对拍、打印中间结果笔试过程中本地调试是保证代码正确性的关键。我常用的调试流程是先在本地IDE写完代码用题目给的示例测试一遍然后自己构造几个边界用例空数组、全是相同元素、n1、n取最大值等再测一遍如果发现答案不对在关键循环处打印中间变量观察哪里偏离了预期。还有一种高效的自测方法是写一个暴力解法作为对拍器随机生成多组测试数据比较暴力解法和优化解法的输出是否一致。如果两者不一致说明优化算法有bug再针对出错的用例单独调试。这个方法在刷题阶段和笔试现场都非常好用。笔试现场可能没有时间写完整的对拍器但你可以提前准备一个随机数生成器的模板需要时直接改造使用能省不少时间。5. 真题复盘从题目场景反推考点5.1 场景还原一道任务调度题的思维路径我根据多个渠道的信息拼凑了一道比较有代表性的题目还原一下思考过程。题目大意是有n个任务每个任务有一个耗时和一个截止时间完成所有任务但允许延时每个任务每延时一个单位时间会产生一个惩罚值求最小化总惩罚的方案。这道题一眼看上去像贪心但仔细一想又不是普通的活动安排。直觉上应该优先处理截止时间早且惩罚值大的任务但这并不总是最优的。正确的解法往往要借助排序优先队列堆来实现后悔贪心先按截止时间排序然后依次处理每个任务将耗时加入当前总耗时同时把耗时放进大根堆。如果当前总耗时超过了该任务的截止时间就从堆中弹出一个耗时最大的任务舍去这样能保证被舍去的任务带来的代价最小。这种方法在多个大厂笔试中都出现过核心思想是在满足约束的情况下代价最大的选择可以被反悔和替换。从这个反推网易笔试的题目很少会要求你套一个现成的模板而是需要你在理解算法本质之后灵活运用。刷题时不能只背模板要理解每个模板背后的证明和适用条件。5.2 压轴题倾向状态压缩DP与多维DP压轴题的一个明显倾向是状态压缩DP和区间DP。状态压缩DP前面已经讲过这里再提一下区间DP。区间DP的经典模型是dp[i][j]表示区间[i, j]上的最优解转移时枚举分割点kdp[i][j] min(dp[i][j], dp[i][k] dp[k1][j] cost)。典型的应用场景是石子合并、矩阵链乘、括号匹配等。区间DP的复杂度通常是O(n^3)n通常在100到500之间。多维DP也是常见类型比如三维DP处理两个序列的编辑距离变体或二维DP加一维状态表示剩余步数。遇到这类题第一是不要慌第二是花时间把状态定义写清楚状态定义对了转移方程往往是水到渠成的。最怕的是状态定义模糊写出来的代码自己都解释不清楚调试会非常痛苦。6. 避坑指南笔试中那些让你失分的隐性陷阱6.1 输入输出格式最常见的非技术性失分点输入输出格式错误大概是笔试中最低级但也最可惜的失分原因。C中使用cin/cout时如果数据量较大务必加上ios::sync_with_stdio(false); cin.tie(nullptr); 这两行代码否则可能因为IO速度过慢导致超时。输出格式方面注意题目要求的是输出一行还是多行、每个数字之间是空格还是换行、是否保留小数、是否区分大小写。这些细节在提交前都要逐一确认。网易的笔试平台有时候会给出多个输出示例说明每个示例对应不同的测试场景。提交前把样例输出的格式逐字符对比一遍看看有没有多余空格、换行是否符合要求。不要觉得这是小事每年都有大量候选人因为最后一行的换行被扣分。6.2 整数溢出与类型选择看似小问题实则大隐患算法题的整数溢出是最常见的隐蔽bug。C中int类型的最大值约是2.110^9如果题目中数据范围给出的是10^9级别的数字涉及加法或乘法时就要小心。两个10^9相加是210^9已经逼近int上限两个10^9相乘是10^18必须使用long long。涉及累加求和、计算乘积、动态规划的中间值时我通常直接使用long long避免在答题过程中反复纠结。Python则无需担心这个问题Python的int是任意精度但要注意数组索引和循环变量的类型转换。另外浮点数比较不能用要用绝对值差小于eps比如fabs(a-b) 1e-9。这在涉及精度计算如二分答案、几何题时非常关键。6.3 边界条件空数组、单元素、最大值最小值的处理边界条件是笔试中区分刷过题和刷透了题的关键。我复盘过很多次自己笔试中的失误发现大部分not pass的测试用例都是边界情况。空数组是否有输出n1时循环体是否执行所有元素都相同时结果是什么数据最大时会不会超时这些情况都要在写完代码后逐项自查。一个实用的技巧是在写代码时把循环边界写成开区间方便调试不一定但至少在提交前把边界条件写在注释里逐条对照确认。比如当n0时直接输出0并返回当leftright时退出循环这些看似废话的注释能帮你集中注意力避免边界遗漏。7. 笔试之外的加分项从代码质量到工程能力展示有些同学以为笔试只要AC了Accepted就行代码写得再乱也无所谓。其实不然。虽然在线评测系统只关心输出结果但部分大厂的笔试系统会保留你的代码内容供面试官查看。面试官在后续面试中可能直接引用你的笔试代码来提问这道题你用了三个数组为什么要用三个有没有可能优化成两个如果代码写得一团糟思路也不清晰即使AC了也可能留下不好的印象。所以笔试时的代码至少要做到命名规范、逻辑清晰、关键步骤有注释。变量名不要用a1、b2这类无意义的名字函数名能体现功能核心逻辑处写一两行注释说明思路。这不只是为了给面试官看也是给自己节省调试时间。两个小时的战斗中清晰的代码结构就是你的救命稻草。另外笔试中偶尔会出现设计题或简答题比如请设计一个LRU缓存请解释一下Redis持久化机制的原理。这类题目考察的是工程素养需要结合具体场景说明技术选型的理由。简历上写过中间件、数据库、分布式系统相关项目的同学遇到这类题就是送分题简历上没有相关经验的话建议多看看常见的系统设计题和中间件原理总结。8. 考后复盘与后续流程衔接笔试结束后的12小时内是复盘黄金期。趁记忆还清晰把自己写的代码、遇到的题目、卡住的点都记录下来。具体来说可以整理成三个list一是完全没思路的题这些题的解法要重点学习弄清楚自己卡在哪一步二是AC了但花费时间很长的题说明算法掌握不够熟练需要专项提升三是因小错误失分的题比如边界条件、整数溢出、输入输出格式这些要建立错误清单下次笔试前反复看。复盘时建议把题目按考点分类统计自己在动态规划、图论、贪心、字符串等模块的正确率和耗时。如果发现某个模块是薄弱项接下来一周就集中刷这个模块的题目直到形成条件反射。刷题数量不是万能但针对性的专项训练绝对有效。从后续流程看笔试通过后一般会进入约面阶段然后是一到两轮技术面加一轮HR面。面试官可能会问到笔试中的题目让你重新讲一遍思路或者在原题基础上做变形和追问。所以考后复盘不仅是为了提升算法能力更是为面试做直接准备。我身边就有同学在面试中被问到你笔试第四题当时用动态规划解决了如果我把数据范围扩大到10^6你会怎么优化由于他考后没有复盘一时语塞非常可惜。最后无论笔试发挥如何都不要陷入自我怀疑。校招是持久战网易笔试只是秋招万里长征的第一步。保持稳定的刷题节奏持续总结复盘机会一定会在某个节点与你相遇。