每年到了六月七月,准备冲互联网大厂算法岗的同学就开始忙起来了。网易2020校招笔试的算法工程师(有道)提前批,算是每年算法岗笔试里比较有代表性的一场,题型、难度、考察方向都挺典型。我当年自己也完整走了一遍这个流程,后面又帮几个学弟学妹复盘过这套笔试题,所以想干脆把这场笔试掰开揉碎聊一聊:它到底考什么、背后的出题逻辑是什么、哪些题是送分题、哪些题是分水岭。不管你是准备投网易还是其他厂的算法岗,这篇都能给你一个挺靠谱的参考坐标系。
先说结论:有道这个提前批算法笔试,整体难度中等偏上,不玩偏题怪题,但特别考验基础功的扎实程度。四十分钟选择题 + 三道编程题是主流配置,偶尔会有简答题。选择题覆盖数据结构、算法复杂度、机器学习基础、概率统计;编程题则偏工程实现,字符串、动态规划、贪心、图论都有可能出现,但不会刻意上太偏的模型,比如AC自动机这种就属于超纲了。准备的主线其实很清晰:数据结构与算法打底,机器学习基础概念不能丢,写代码别翻车。
1. 笔试整体设计与考点拆解
1.1 网易有道算法岗笔试到底考什么
有道这个部门的业务线非常明确:词典、翻译、在线教育、OCR、语音相关。所以笔试的出题风格会明显偏向自然语言处理、搜索排序、推荐系统、语音信号处理这些方向。举个直观的例子,选择题里大概率会出现跟TF-IDF、word2vec、LSTM相关的基础概念题,编程题里也可能出现字符串匹配、文本处理的变形题。
整体上笔试由下面几块构成:
- 选择题或者多选题,覆盖数据结构、算法分析、机器学习、深度学习、概率统计、线性代数。
- 编程题两道到三道,通常用牛客网或者赛码网的环境,支持C++、Java、Python,ACM模式为主,需要自己处理输入输出。
- 偶尔会有简答题,比如让你写一个样本的交叉熵计算过程,或者解释某个机器学习算法的核心思想。
这不是那种“暴力题海”式的选拔,它更看重你是否有扎实的计算机基础,同时对机器学习的基本链路有没有清晰的理解。毕竟算法工程师不只是调包,还得能造轮子、能优化链路。
1.2 为什么提前批笔试值得单独准备
很多同学觉得提前批就是走过场,随便投投,等正式批再发力。这个想法我劝你尽早丢掉。提前批是公司抢人的第一波,hc相对充足,面试流程也往往更短。网易的提前批笔试如果成绩好,后续面试的起点就不一样,面试官会默认你基础过关,重点聊项目和算法深度,而不是在LeetCode简单题上纠缠。
另外从备考效率来说,提前批的笔试题型跟正式批高度重合,你提前批练好了,正式批同样是这套体系,等于一套准备吃两波红利。网易的笔试题目内容每年会有变化,但出题逻辑非常稳定,只要基本功到位,题型再变也跑不出这个框架。所以千万别把提前批笔试当儿戏,这是你整个校招季成本最低但收益最高的一次机会。
2. 题型拆解与核心细节分析
2.1 选择题:数据结构与算法基础是重头戏
选择题这一块,数据结构与算法的比重至少占一半,剩下的分散在机器学习、概率统计、线性代数里。数据结构的考点非常稳定,栈、队列、二叉树、图、堆、哈希表,外加各类排序算法的时间复杂度对比。
有几个高频考点我得单独点名:
- 排序算法的稳定性与时间复杂度。快速排序平均O(nlogn)、最坏O(n^2),归并排序稳定且始终O(nlogn),堆排序原地排序但缓存不友好。这些对比表必须刻在脑子里,有时候还喜欢把稳定性跟具体场景结合,比如“按成绩排序并保持原有顺序”选稳定排序。
- 二叉树的各种遍历组合。给前序和中序推后序,属于必考题型。核心思路是前序第一个是根,再到中序里找根的位置,左右子树自然分开,递归处理。
- KMP算法的next数组计算。这个几乎是互联网大厂笔试的保留项目,看着基础,但很多人上手算就出错。我前面提过类似题目,比如p = "abacaba"这种模式串,让你手算next数组,核心是理解前缀和后缀的最长公共部分。
机器学习这边,考点集中在模型评估、防止过拟合的手段、常见损失函数的特性。比如交叉熵损失为什么比均方误差更适合分类、L1正则化和L2正则化的区别是什么。L1会把权重推向稀疏解,L2只限制权重大小但不会归零。这些都是面试笔试反复出现的内容,选择题里只要理解了原理就能做对。
概率统计则喜欢出条件概率、贝叶斯公式、期望、方差类的题。线性代数偶尔会出现矩阵特征值、特征向量相关的基础概念。
2.2 编程题:不只考AC,还考工程思维
编程题是笔试的重头戏,也是拉分最狠的地方。网易的编程题一般有三道,难度梯度是简单到中等再到偏难。题目风格上,有道的题目经常带着业务场景,比如词典里最短编辑距离、翻译结果中的候选排序、OCR识别后的文本处理,但剥掉外壳后核心还是经典的算法模型。
第一道一般是纯送分题,算是热身。比如给定一个数组,找出某个条件下的最大值或者求和,用暴力解法通常就能过。但送分题也得注意输入输出的边界,比如数组长度可能到10^5级别,O(n^2)会超时,得提前想清楚时间复杂度。
第二道开始上强度,常见的是动态规划、贪心或者字符串处理。我印象里网易比较喜欢出“最小编辑距离”变种,核心解法是二维dp。有些同学背过模板但不会灵活变通,题目一旦从字符串换到数组或者反过来了就懵,这就是平时做题不够扎实的表现。
第三道往往是压轴题,可能涉及图论或者复杂状态转移。比如无向图的连通分量、最短路(Dijkstra)、带权并查集这类。这里考察的不只是你会不会某个算法,而是面对一个包装过的实际问题,你能不能把它抽象成已知的数学模型。
除了算法本身,ACM模式的输入输出处理也很重要。很多人本地测试没问题,一提交就报运行错误,多半是输入解析时出了岔子。用Python的话注意input()和sys.stdin.readline()的区别,用C++得留意EOF的处理。
2.3 算法设计题与简答题:验证工程落地的能力
有些批次会加一道简答或者设计题,常见的有两种形式:一种是让你写一个伪代码或者核心代码片段,实现某个指定功能;另一种是场景设计题,比如“如何设计一个在线教育场景下的题目推荐排序策略”。
这种题其实很能拉开差距。写伪代码的题目,本质还是在考基础算法,但比编程题多了一层限制:不给你调试机会,逻辑必须一遍理顺。场景设计题则是对综合能力的考察,需要结合机器学习知识储备。比如推荐排序策略,不能只说“用CTR预估”,得说清楚特征怎么来、正负样本怎么定义、线上预估用什么模型、离线怎么评估。这种答题套路是前置的,临时编是编不出来的。
我之前见过学弟在简答题上翻车,原因不是不会做,而是写得没有条理。面试官看简答题的时间很有限,如果描述杂乱、没有分点,就算你心里清楚也很难被看到。我的建议是碰到这种题,先写一句话结论,再按数据、特征、模型、评估的顺序展开,这样至少框架是完整的。
3. 重点算法考点精讲
3.1 KMP算法的next数组:笔试必考的细节
KMP算法在笔试里出现的频率高得吓人,尤其是next数组的推导。很多人面试的时候能讲清楚KMP原理,但一让手算next就露馅。核心在于next[i]的定义:通常表示模式串p中,以p[i]结尾的子串的最长相同前缀后缀长度。注意不同教材对next数组下标定义有差异,比如有的从0开始、有的从1开始,考试时先看清楚题目给的定义。
我拿p = "abacaba"来走一遍,方便你对照理解。先说以0下标开头、next[i]表示p[0..i]这个子串的最长相等前后缀长度这种约定:
- i = 0,子串为"a",没有真前缀和真后缀,next[0] = 0。
- i = 1,子串为"ab",前缀有"a",后缀有"b",没有相等的,next[1] = 0。
- i = 2,子串为"aba",前缀"a"、"ab",后缀"a"、"ba",最长相等的是"a",长度1,next[2] = 1。
- i = 3,子串为"abac",前缀结尾不会跟后缀"c"的匹配,所以next[3] = 0。
- i = 4,子串为"abaca",前缀"a",后缀"a",next[4] = 1。
- i = 5,子串为"abacab",前缀"ab",后缀"ab",长度2,next[5] = 2。
- i = 6,子串为"abacaba",前缀"aba",后缀"aba",长度3,next[6] = 3。
所以next数组为[0, 0, 1, 0, 1, 2, 3]。实际题目中如果定义next[i]表示失配后模式串跳转的位置,可能整体右移一位,也就是下标从1开始,next[i] = 前面算出的next[i-1]。这个细节非常容易让人在考场上发慌,所以我的建议是平时做题时就把不同定义下的写法都练一遍,考试时先花十秒确认题目约定。
3.2 排序算法:复杂度、稳定性、应用场景的对比
排序算法在选择题里的出镜率极高,而且喜欢出对比型问题。我整理了一个你自己也要动手整理的速查表,笔试前过一遍非常有用:
| 排序算法 | 平均时间复杂度 | 最坏时间复杂度 | 额外空间 | 稳定性 |
|---|---|---|---|---|
| 冒泡排序 | O(n^2) | O(n^2) | O(1) | 稳定 |
| 插入排序 | O(n^2) | O(n^2) | O(1) | 稳定 |
| 选择排序 | O(n^2) | O(n^2) | O(1) | 不稳定 |
| 快速排序 | O(nlogn) | O(n^2) | O(logn) | 不稳定 |
| 归并排序 | O(nlogn) | O(nlogn) | O(n) | 稳定 |
| 堆排序 | O(nlogn) | O(nlogn) | O(1) | 不稳定 |
空间这一块,快速排序虽然原地分区,但递归调用会占用栈空间,所以平均是O(logn),而不是O(1)。归并排序的空间是O(n),因为需要临时数组合并。笔试如果考这些细节,往往就是用来区分“背过八股”和“真正理解”的。
另外举个例子,如果题目问“数据量很大,只能部分载入内存,如何排序”,这其实在暗示外部排序或者归并的思想,而不是让你回答快排。会出这种题,就说明光记住复杂度表还不够,得理解每个算法的核心机制。
3.3 贪心、动态规划与搜索剪枝:编程题的主战场
编程题考贪心和动态规划的概率非常高。贪心算法的关键是要证明贪心策略的正确性,但在笔试时间紧张的情况下,更实用的是靠直觉加反例验证:快速判断有没有明显的反例,如果没有,就大胆按贪心策略写。经典题有区间调度、跳跃游戏、分糖果这类。
动态规划则需要练出肌肉记忆。拿到题目先想三步:状态定义、转移方程、边界条件。比如最长上升子序列,状态是dp[i]表示以第i个元素结尾的最长上升子序列长度,转移是dp[i] = max(dp[j] + 1)其中j < i且nums[j] < nums[i]。边界条件是所有dp[i]初始化为1。这类题目在笔试里出现频率太高了,背包问题、编辑距离、回文子串、打家劫舍系列都是常客。
搜索剪枝也是容易被低估的点。笔试题目如果数据范围不大,比如n <= 20,暴力递归加上合理的剪枝往往就能过。常见剪枝方式有:可行性剪枝、最优性剪枝、记忆化搜索。记忆化搜索本质上就是动态规划的递归写法,用的时候注意状态表的定义要覆盖递归函数的输入维度。
我记得有一道经典题是“走到终点的方案数”,既可以用DFS+剪枝,也可以用二维DP。笔试时如果对DP没把握,DFS+剪枝其实是更稳妥的兜底方案,复杂度和代码可靠性都更容易控制。
3.4 深度学习与机器学习考点:不止是调参
网易的算法笔试虽然不会让你手写反向传播的完整推导,但基础概念一定会考。CNN的卷积核尺寸对感受野的影响、RNN的梯度消失原因、LSTM的门控机制、Transformer的自注意力机制,这些都是高频考点。
选择题爱考的点包括:
- 过拟合的解决方案:增加数据量、正则化、Dropout、早停、数据增强。
- 梯度消失和梯度爆炸:本质是反向传播中梯度连乘导致,常见的应对手段有ReLU激活函数、BatchNorm、残差连接、梯度裁剪等。
- 优化器的发展历程:SGD、Momentum、AdaGrad、RMSProp、Adam。注意Adam结合了动量和自适应学习率的思想,但有时候在泛化性上不一定比SGD好,考过多次。
另外统计机器学习里的经典模型也是必考项:逻辑回归的损失函数、SVM的核函数选择、决策树的划分依据(信息增益、信息增益率、基尼指数)、随机森林和GBDT的区别。这些内容要做到能用自己的话讲清楚,而不只是会选答案,因为面试环节还会继续深挖。
3.5 粒子群算法与模拟退火:识别即可,不慌
可能有同学看到热搜词里有“粒子群算法原理”“模拟退火算法”,会担心笔试会不会考这些偏启发式算法。其实从网易历年的笔试风格来看,这些属于了解级别,大概率不会出编程题。选择题可能会有一道送分类的题,比如“粒子群算法中,每个粒子更新速度时需要考虑哪几个部分”,答案是惯性权重、个体最优、全局最优三者的综合影响。
模拟退火则要理解它的核心思想:以一定概率接受比当前解更差的状态,从而跳出局部最优。判断温度变化趋势、Metropolis准则这种都属于概念级别。
我的建议是这些算法不需要花太多时间刷题,但要能用自己的话解释原理,至少看到选项时能认出来。如果时间紧张,优先把KMP、排序、DP、贪心这些主考点吃透,收益会高得多。
4. 笔试实战中的常见问题与排查技巧
4.1 时间分配:编程题至少留出1小时
网易整个笔试流程大概两小时到两个半小时,编程题一般需要至少1小时以上。我见过太多人死磕选择题,一道概念题纠结五分钟,最后编程题草草交卷。这是性价比极低的策略。
我的建议是拿到试卷先花两三分钟把整张卷子扫一遍,大致判断选择题难度和三道编程题的递进关系。然后按顺序做,但遇到卡壳超过三分钟的选择题果断跳过,先做后面的编程题。编程题如果第一道很简单,别急着提交,先检查边界条件和极端输入,因为AC率不高往往就是边界问题。
4.2 编程题的经典翻车点
输入输出格式是最大的翻车点。牛客网和赛码网的输入输出要求略有区别,赛码网有时候很严格,多余的空格或者换行都会出问题。用Python的人特别容易踩的一个坑是:一次性读入所有行,然后split的时候没考虑到空行。建议直接用sys.stdin.readline()按行处理,尽量别用input(),尤其当数据量大的时候。
另一个常见的翻车点是整型溢出。题目没有说明数据范围时,默认数组里的数可能是10^9甚至更大,求和或相乘之后用int可能溢出。C++直接用long long,Java用long,Python就不存在这个问题,这也是Python在笔试里的一个天然优势。
还有个隐蔽的坑是排序稳定性。如果题目要求“分数相同按名字字典序排列”,很多人直接用Python的.sort(),如果键设计不对,同样的分数可能顺序就乱了。正确做法是构造(key1, key2)的元组作为排序键,或者用稳定的排序算法,比如Python的sorted就是稳定的,但C++的sort不是稳定排序,要用stable_sort。
4.3 调试技巧与常见run error排查
ACM模式下没有断点调试,我自己的习惯是本地用Jupyter或IDE写,小数据验证完直接提交。如果出现run error,别急着重新写,先检查下面几个地方:
- 数组越界:循环里下标是不是从0开始,会不会访问到n-1以外。
- 递归深度过大:Python默认递归深度1000,如果考DFS或者递归,深度可能超过限制,提前用sys.setrecursionlimit()设置大一点。
- 变量名拼写错误:这听起来有点蠢,但考场上人一紧张,拼错函数名或者变量名是真实发生的。
如果程序逻辑没看出问题但超时了,优先考虑优化输入输出而不是改算法。Python用户把input()换成sys.stdin.readline(),C++用户取消iostream的同步(加上ios::sync_with_stdio(false)),这些操作往往能解决一部分超时问题。
4.4 选择题别恋战,用好排除法
选择题里有些概念题你一眼看不出正确答案,但可以很快排除掉一两个明显错误的选项。比如考排序稳定性,如果一个选项写“快速排序是稳定的”,直接排除,哪怕其他选项不完全确定,正确率也能从25%提升到33%。
有些计算类选择题,比如手算某个数组的KMP next数组、算克拉默法则或者贝叶斯后验概率,这些题是可以花时间算的,因为算出来就是确定答案。但如果是“以下哪个说法不正确”这种概念辨析,先跳过做完其他题再回来看,往往会有新的判断。
5. 备考路径与实用建议
5.1 按优先级去复习,别平均用力
根据网易笔试的特点,我给出一套可以照抄的复习优先级排序,尤其是从零开始准备或者时间比较紧张的同学,直接按这个顺序分配时间就好:
第一优先级:数据结构与算法基础。数组、链表、栈、队列、树、图、哈希表;排序、二分、双指针、滑动窗口、DFS/BFS、DP、贪心、并查集、KMP。这些决定了你能不能在倒数第二道和最后一道编程题上拿分。
第二优先级:机器学习与深度学习核心概念。逻辑回归、决策树、SVM、朴素贝叶斯、K-means、CNN、RNN、LSTM、Transformer的基本原理;过拟合、正则化、优化器、损失函数、评估指标。这部分决定选择题能不能拿到基础分。
第三优先级:概率统计与线性代数。贝叶斯、期望、方差、条件概率、矩阵运算、特征值。这些不是每场笔试都大面积出现,但如果选择题里有一两道,就是区分度所在。
第四优先级:业务场景的理解。有道的业务看音频、OCR、NLP、在线教育,如果你对语音信号处理的基础概念如重采样、MFCC、端到端语音识别有常识性了解,设计类题目会更有话可说。
5.2 LeetCode刷题策略:质量比数量重要
很多人喜欢追求刷题数量,每天刷十道简单题,成就感拉满。但笔试成绩不会骗人,刷到500题却只会做Easy,还不如把200题做深做透。
我的刷题策略是:按照题型分类,每类题先掌握核心模板,再做变式题。排序相关题目练几道就够,重点放在DP和搜素类题目上。背包问题、最长递增子序列、编辑距离这三类DP题,几乎可以覆盖40%的笔试场景。字符串处理类题目在网易这种NLP背景浓厚的部门里也是高频,KMP、字典树、manacher如果时间充裕也建议掌握。
刷题时养成一个习惯:每做完一道题,用一句话总结它的核心套路。比如“这道题是典型的区间DP,先把所有子区间长度枚举一遍”“这道题是Dijkstra的变形,边权需要根据当前状态变化”。有了题目归类能力,笔试看到新题时才能快速把它映射到已知模型上。
5.3 模拟笔试环境的必要性
校招笔试跟平时刷LeetCode完全是两个节奏。平时刷题错了可以反复提交,笔试的机会就一次,心态压力完全不同。所以考前一定要做至少两次完整的模拟,不限时也算,重点是把考试流程走一遍。
模拟的关键点有几个:第一是熟悉牛客网或者赛码网的编辑器,自动补全和缩进逻辑跟IDE不一样,提前适应可以减少考场上不必要的焦虑;第二是严格控制时间,务必按真实考试的时间分配来,逼自己在90分钟内把选择题和编程题都过一遍;第三是完完整整地把代码写一遍,而不是在本地IDE里调试好了再粘过去,因为ACM模式本身就需要处理输入输出。
5.4 提前批的信息差:时间节点与笔试渠道
每年提前批开放的时间会有差异,建议从五月开始就盯紧网易招聘官网和牛客网的招聘板块。错过提前批并不可怕,但如果你恰好提前批就能上岸,意味着后续两三个月可以安心准备论文或者找实习,完全不用卷正式批的洪流,这种节奏上的舒服是很值得争取的。
笔试结果通常在一周内通过邮件或短信通知,如果一周没消息也不用太焦虑,可以礼貌地在牛客网或官方公众号后台询问进度。另外,网易的笔试支持改期机会有限,尽量选一个网络稳定、安静的时间段,因为ACM模式的代码提交对网络延迟非常敏感,卡在交卷那一刻网络断了会让人崩溃。
写在最后
回头看网易2020校招笔试这道坎,我最深刻的体会是:算法岗笔试拼的不是天赋,而是信息差和准备度。题型就那些,知识点就那些,谁先顺着正确的优先级把基础打牢,谁就能在笔试阶段占据主动权。我自己踩过最大的坑就是前期平均用力,研究了一堆冷门算法,结果基础题反而失了分,后来调整策略才慢慢拉回来。如果你正在准备类似的提前批笔试,别慌,先做一套真题摸清自己的底子,再按优先级有针对地补。把一个知识点吃透,好过囫囵吞枣背十个。希望这篇复盘能帮你省掉一些绕弯路的时间,祝笔试顺利。