☰
网易有道校招算法笔试题解析:KMP、动态规划与机器学习考点复盘
2026/10/14 8:02:44 网站建设 项目流程

网易2018校园招聘算法工程师(有道)笔试卷,这是一套很有代表性的校招真题。那会儿我还在准备秋招,刷到这套卷子的时候第一感觉是:相比纯互联网大厂动辄四道编程题的卷子,网易有道的算法笔试题更“综合”,除了写代码,还会认真考察概率统计、机器学习基础和业务思维。如今回看,虽然年份稍早,但其考点分布和命题思路依然值得准备算法岗的同学考古参考。特别是KMP的next数组推导、动态规划、贪心、图论和机器学习基础,这些内容在校招笔试里出现的频率一直很高。

这套卷子的内容,目前网上能搜到的基本是当年考生在牛客网、知乎、博客里的回忆版,并非官方完整原卷。但正因为是回忆整理,反而更接近实际考场上大家能感知到的重点。这篇文章我按“试卷结构 → 核心考点拆解 → 编程题实操复盘 → 机器学习与概率统计 → 备考建议”来写,尽量把每一类题背后的知识点和解题套路讲透。

1. 试卷整体结构:网易有道的算法笔试到底考什么

1.1 从岗位倒推考点

网易有道2018年时的主要产品线包括有道词典、有道翻译、有道云笔记、有道精品课等,这些产品都有大量搜索、推荐、NLP相关的业务场景。所以它的算法工程师笔试不是纯粹的LeetCode刷题比赛,而是带着业务味道的选拔:既要求你数据结构与算法基本功扎实,又要求你懂机器学习基础,还希望你有一定的概率统计功底。

这一点可以从题型分布上看出来。一个典型的算法岗笔试试卷,大致会有单选题、多选题、编程题以及问答/简答题。单选题里会出现“以下哪种排序算法平均时间复杂度最低”这类送分题,也会出现“一个袋子里有红球白球,取两次不放回,求第二次取到红球的概率”这类概率题。编程题一般有两到三道,难度梯度拉开,第一道往往是字符串或者模拟题,后面会出现DP或者搜索题。

我当时拿到这套卷子,第一反应是先把所有题目浏览一遍,标出会做的和不会做的,优先把送分题拿下,再啃硬骨头。这个策略在时间紧张的笔试中非常关键。

1.2 典型题型分布

按照常见校招算法笔试的口径,我把这类卷子的模块和占比整理成一张表,方便你对照复习:

考察模块常见考点预估占比
数据结构与算法栈、队列、链表、二叉树、哈希、排序、KMP、二分、贪心、DP、图论35% - 45%
概率统计与数学古典概型、条件概率、期望、随机变量、排列组合10% - 15%
机器学习基础过拟合、正则、交叉验证、特征选择、常见模型对比10% - 15%
深度学习与NLP词向量、RNN/LSTM、注意力机制、文本分类5% - 10%
编程题字符串处理、动态规划、搜索、模拟、手写数据结构30% - 40%

当然,每年每套卷子的权重会有浮动,但这张表基本能反映网易有道的命题倾向。相比腾讯笔试喜欢出大量计算机基础比如网络和操作系统,网易有道的算法岗试卷明显更聚焦在“算法与数据科学”相关的内容上。

1.3 命题风格里藏着的业务影子

做这套卷子,你会发现题目有时候会披着一层业务外衣。比如“用户在搜索引擎输入一个词,返回一系列结果,如何评估排序质量”、“给定一批用户行为日志,如何设计特征预测点击率”之类的描述。这类题目表面考机器学习,实际是看你能不能把算法落地到具体场景里。

有道的算法工程师,很大一部分工作涉及词典数据挖掘、翻译质量评估、搜索排序和推荐。笔试环节出现业务化描述,是为了提前筛选出那些“只会调包但不懂业务逻辑”的候选人。所以备考时不要只看算法题,还要想想这些算法用在哪、为什么用、有什么坑。

2. 核心考点拆解:数据结构和算法部分

2.1 常考数据结构:栈、队列、二叉树与哈希表

数据结构部分,选择题和编程题都会涉及到。栈常考的是括号匹配、表达式求值;队列常考的是BFS和循环队列;二叉树是重头戏,遍历方式、层级遍历、二叉搜索树性质、最近公共祖先都是高频考点;哈希表则更多是结合工程设计来考,比如哈希冲突的解决方式、负载因子、扩容策略。

我建议你把二叉树的非递归遍历写法背到条件反射的程度。笔试环境下,递归容易栈溢出,而且有些题目明确要求迭代实现。非递归前序、中序、后序、层序遍历,各写一遍,其实也就几十行代码,但考场上省下来的时间很宝贵。哈希表部分,要理解链地址法和开放定址法的区别,以及为什么Java的HashMap在链表过长时会转成红黑树。这些内容看起来基础,单选多选都能出,而且容易被忽视。

2.2 排序算法:不只是背复杂度

排序算法几乎必考,但很少直接让你写一个快速排序。更多考察的是复杂度分析、稳定性、适用场景,以及排序算法思想在其它题目中的应用。

比如快速排序最坏时间复杂度是O(n^2),堆排序是O(n log n)且不稳定,归并排序稳定但需要额外空间。这些知识点本身不难,但要在选择题里快速判断,就需要你真的理解每一层递归发生了什么。像“在完全乱序的大数据量场景下,哪种排序最快”“STL的sort底层用了什么混合策略”这类问题,考察的就是对排序工程实现的了解。

另外,堆排序的思想经常用于TopK问题,归并排序思想用于外部排序。如果你在编程题里遇到“从海量数据中找最大的K个数”,能想到用小顶堆而不是全排序,这就体现出了工程思维。

2.3 KMP算法与next数组推导

字符串匹配是校招笔试里的常客,KMP更是热搜词里的高频内容。网易有道的试卷里出现KMP相关的题,我并不意外。这类题不会让你从零发明KMP,而是考察你是否理解next数组的推导,以及模式串失配时到底怎么跳。

以模式串 p = "abacaba" 为例,常见定义是 next[i] 表示 p[0:i+1] 这个子串的“最长相等真前后缀长度”(不包含子串自身)。我们逐步推导:

  • i = 0,子串是 "a",没有真前后缀,next[0] = 0。
  • i = 1,子串是 "ab",前缀 "a",后缀 "b",不等,next[1] = 0。
  • i = 2,子串是 "aba",前缀 "a" 等于后缀 "a",最长长度为1,next[2] = 1。
  • i = 3,子串是 "abac",前缀 "a"、后缀 "c",不等;前缀 "ab"、后缀 "ac",不等,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[0] 定义为 -1,next[i] 表示前 i 个字符(长度为 i)的最长相等真前后缀长度。比如《算法导论》的 π 数组和国内教材里的 next 数组定义有差异。如果按 -1 偏移的那套定义,上面这个模式串可以写成 [-1, 0, 0, 1, 0, 1, 2, 3]。在考场上,我强烈建议先看清楚题目给的 next[i] 到底是哪种定义,再开始填数,不然容易整道题崩掉。

下面给出一段C++的KMP next数组求解代码,写代码时建议使用“前缀函数”的定义,逻辑清晰且不容易出错:

vector<int> buildNext(const string& p) { int m = p.size(); vector<int> next(m, 0); for (int i = 1, j = 0; i < m; i++) { while (j > 0 && p[i] != p[j]) { j = next[j - 1]; } if (p[i] == p[j]) { j++; } next[i] = j; } return next; }

KMP的匹配过程其实就是“主串指针不回溯,模式串指针按next跳转”。理解了next数组的递推逻辑,做匹配部分的代码就是顺手的事。这道题如果出在选择题,一般会给一个模式串和一段主串,问你匹配过程中比较了几次,本质上还是考察next数组理解得透不透。

2.4 图论与搜索:Dijkstra、拓扑排序

图论在算法岗笔试里不会像ACM那样考得很难,但基础算法必须会。Dijkstra是单源最短路里的明星算法,哪怕不让你完整手写,也会考“优先队列优化后的时间复杂度”“负权边能不能用Dijkstra”这类概念题。你要能说清楚为什么Dijkstra不能处理负权边,以及Bellman-Ford和SPFA分别适合什么场景。

拓扑排序也值得重视。给定一个有向无环图,输出拓扑序列。这个知识点可以结合“课程安排是否存在循环依赖”这种业务化问题来考。Kahn算法是直观做法:统计每个节点的入度,把入度为0的节点放入队列,依次处理并减少后继节点的入度。这个算法在判断有向图是否有环时也很有用。

我当时复习图论时有个习惯:把所有经典算法的适用条件和复杂度写在一张卡片上,比如Dijkstra是贪心思想,要求非负权;BFS能求无权图的最短路;拓扑排序只适用于有向无环图。这样面对选择题时,可以快速排除错误选项。

3. 编程题实操复盘:思路、代码与踩坑

3.1 动态规划:从状态定义到边界条件

网易系的编程题,动态规划是常客。常见题型包括编辑距离、最长公共子序列、最长上升子序列、背包问题、股票买卖问题等。这些题在LeetCode上都有原型,但笔试里往往会在输入输出上做些包装,考察你能不能把实际问题抽象成状态转移。

以最长上升子序列为例,最直观的O(n^2)做法是定义dp[i]为以第i个元素结尾的最长上升子序列长度,转移方程是 dp[i] = max(dp[j] + 1),其中 j < i 且 nums[j] < nums[i]。如果数据范围到10^5,就需要借助贪心加二分的O(n log n)解法,用tail数组维护上升子序列的最小末尾。

我在复盘这类题时,总结了一个步骤:先定义状态,再写转移方程,然后确认初始化和遍历顺序,最后考虑能否优化空间。笔试时间紧,如果一开始不知道用DP,可以先试试暴力递归,画出递归树后再看有没有重叠子问题。这个方法在紧张状态下很管用。

3.2 贪心算法:什么时候敢用贪心

贪心算法在笔试里考得比较多的是区间类问题。比如“给定一系列会议的开始和结束时间,最多能安排多少场不冲突的会议”这个经典题,按结束时间排序然后依次选择就是正确答案。

但贪心最怕的是“感觉对但实际上是错的”。我建议在写贪心解法前,先用小数据在草稿纸上模拟一遍,至少排除明显的反例。比如经典的“硬币找零最少硬币数”问题,在硬币面额为1、5、11时,贪心选最大面额不一定得到最优解,这种反例要能举出来。校招笔试一般不会出太偏的贪心,但考察方式往往是把贪心和排序结合起来,让你先排序再扫描一遍,所以排序比较器的写法要熟练。

3.3 手写代码的常见坑:边界、溢出与输入输出

编程题最容易翻车的不是算法本身,而是边界条件和输入解析。当年我用C++做笔试,经常在快排的边界、二分查找的循环条件、字符串分割上浪费大量时间。后来我把这些常见坑整理成了检查清单:

  • 空数组、链表只有一个节点时,程序是否正常?
  • 二分查找的左闭右开还是左闭右闭,循环条件是否与mid更新一致?
  • 整数加减乘除是否可能溢出?尤其是求中位数用 (left + right) / 2 时,left + right 可能超出int范围。
  • 字符串输入是否可能包含空格?如果包含,用cin、scanf还是getline要想清楚。
  • 输出格式是否要求保留小数点后几位?题目没说就不要画蛇添足。

笔试环境通常不允许调试太久,所以这些边界问题必须在写代码时就有意识规避。我的习惯是写完代码后,手动构造三组测试:正常输入、极端输入(最大值/最小值)、空输入。

3.4 一道完整示例:旋转数组中的二分查找

网易的编程题出现过类似“在一个有序数组经过旋转后,查找目标值”的题目。这道题能综合考察二分查找的边界意识,非常典型。我给出一个完整的C++实现:

int search(vector<int>& nums, int target) { int left = 0, right = nums.size() - 1; while (left <= right) { int mid = left + (right - left) / 2; if (nums[mid] == target) { return mid; } if (nums[left] <= nums[mid]) { // 左半部分有序 if (nums[left] <= target && target < nums[mid]) { right = mid - 1; } else { left = mid + 1; } } else { // 右半部分有序 if (nums[mid] < target && target <= nums[right]) { left = mid + 1; } else { right = mid - 1; } } } return -1; }

注意 mid = left + (right - left) / 2 而不是 (left + right) / 2,就是为了防止整数溢出。很多题解不会强调这个细节,但笔试和面试里这属于加分项。

另外,这道题还有一个变体:如果数组中存在重复元素,nums[left] <= nums[mid] 这个判断就可能失效,因为可能出现“左指针、中指针、右指针三者相等”的情况,此时只能暴力缩小范围。这个点如果在选择题里出现,值得你展开想一想。

3.5 考场上编程题的答题顺序

遇到两三道编程题,我的策略永远是一道一道做,但会先花30秒判断每道题的难度。简单字符串题一般10分钟内搞定;中等DP或搜索题控制20到25分钟;如果某题想了10分钟还没有思路,先跳过,把后面能拿的分拿稳,再回头啃。

网易的笔试系统通常允许在本地IDE里写,然后粘贴到网页代码框。建议先在本地跑通样例,再提交到在线判题系统。毕竟网页上的编译报错信息往往比较简略,本地能更快速定位问题。

4. 机器学习与概率统计的考察重点

4.1 机器学习基础:过拟合、正则化与模型对比

算法工程师的笔试不会只考代码,机器学习基础是拉开差距的关键。常见考点集中在过拟合、正则化、交叉验证、特征选择、逻辑回归和SVM等经典模型。

过拟合这块,你要能说出“训练误差低但测试误差高”的现象,以及对应的缓解手段:增加训练数据、降低模型复杂度、正则化、Dropout、早停、数据增强。正则化里,L1要比L2更容易产生稀疏权重,这一点理解L1的梯度在0附近的不连续性就能明白。

逻辑回归与SVM的对比也是高频。逻辑回归输出的是概率,天然适合做排序和CTR预估;SVM适合小样本高维分类,核技巧能处理非线性问题。但SVM不直接输出概率,需要做Platt缩放。这些对比在单选多选里经常出现,所以复习时最好自己整理一张“经典模型速查表”。

4.2 概率统计:古典概型与期望计算

概率题是网易笔试卷里稳定出现的部分。常见的题型有:

  • 袋子里有3个红球5个白球,不放回取两次,求第二次取到红球的概率。
  • 一枚不均匀硬币正面朝上的概率为p,连续抛n次,求恰好出现k次正面的概率。
  • 随机变量X服从某个分布,求期望和方差。
  • 贝叶斯公式的条件概率问题。

这类题的核心是不要凭直觉,而是把事件空间写清楚。比如“第二次取到红球”这个问题,全概率公式可以拆成“第一次取红球,第二次取红球”加“第一次取白球,第二次取红球”两部分,答案自然算出来。期望计算上,线性性质常常能简化问题,比如“n个独立事件出现次数的期望等于各事件期望之和”,这个性质能解决很多看起来复杂的题目。

4.3 深度学习与NLP基础

有道做词典和翻译,所以深度学习与NLP的相关知识,在笔试里出现的可能性不低。2018年时Transformer刚提出不久,校招考察不会太深,但词向量、RNN/LSTM、注意力机制、文本分类这些概念要懂。

词向量要理解one-hot的缺点和word2vec的基本思想;LSTM要知道它通过门控机制缓解RNN的梯度消失问题;注意力机制最简单理解是“在解码时动态地关注输入的不同部分”。如果题目给出一个小场景,比如“用深度学习做情感分类,文本长度不一怎么办”,那你需要想到padding、截断、或者用LSTM处理变长序列。

我当时备考NLP的一个取巧方法:不追求手推公式,而是把每个模型“解决什么问题、核心思想是什么、有什么局限性”三句话说清楚。笔试选择题考察的是理解,不是推公式。

4.4 遇到不会的题怎么办

考试总有不会的题。我的原则是:选择题不会,先排除明显错误选项,再用常识猜;多选题拿不准的选项宁可不选,因为少选还能得部分分,错选直接0分;编程题不会完整做,也尽量写出暴力解法或部分通过,很多在线判题系统是按测试点给分的。

曾有一个考过网易笔试的同学告诉我,他一道DP题没想出来,但写出了能过前30%测试点的暴力版本,最后笔试依然通过了。暴力解不是耻辱,在有限时间里拿分才是硬道理。

5. 常见问题与备考复盘

5.1 校招算法笔试复习看什么书

如果你现在离笔试还有三个月,建议按这个顺序复习:

  • 先过一遍《剑指Offer》的经典面试题,培养常见算法题的解题手感。
  • 然后用LeetCode或牛客网刷题,重点刷数组、字符串、链表、二叉树、动态规划、二分查找、贪心这几类。不需要刷难题,中等题熟练就够了。
  • 算法基础薄弱的,可以把《算法(第4版)》或者在线的“代码随想录”刷一遍,配合图解理解数据结构。
  • 最后留一到两周做历年真题,按笔试环境模拟,练习时间分配。

5.2 容易忽略但必须会的知识点

不少人刷题只刷热门题,结果笔试选择题里一些“冷门”知识点反而扣分。我整理了几个容易被忽略、但出现频率不低的知识点:

  • 位运算:异或的性质、用位运算判断奇偶、n & (n-1) 去掉最低位1。
  • 二分查找的变体:查找第一个大于等于target的位置、最后一个小于等于target的位置。
  • 大数据量处理:海量数据去重、TopK、外部排序,要知道位图和布隆过滤器的思想。
  • 手写常见数据结构:栈实现队列、队列实现栈、LRU缓存。

5.3 复盘一套真题的正确姿势

很多同学刷真题,做完对答案就扔,这是最亏的。我建议每套卷子做三遍:

第一遍,限时模拟,按真实考试节奏做,做完只看分数,不细看答案。第二遍,逐题分析,把每道题背后的考点写出来,标记不会的题目,找到对应知识点重新学习和刷相同类型题。第三遍,隔一周后重做,尤其关注错题和蒙对的题,确认自己真的掌握了。

如果你把一套网易道笔试试卷按这个流程走下来,收获会超过盲目刷十道新题。毕竟校招笔试考来考去就是这些基本功,反复锤炼才是王道。

5.4 简历里的项目也要经得起追问

笔试通过后还有面试,而面试官很喜欢从你简历里写到的算法往下问。比如你写了“用粒子群算法优化参数”,那就要能回答粒子群算法和遗传算法的区别、惯性权重怎么设置、为什么收敛快但容易早熟。你写了“用BM25做搜索排序”,就要理解BM25的词频、逆文档频率和文档长度归一化是怎么结合的。

所以备考笔试时顺便把简历里的算法过一遍概念,既能帮助笔试,又能衔接面试。毕竟算法工程师这个岗位,笔试只是敲门砖,真正决定offer的,是对算法本质的理解和落地能力。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询