
每年八九月份各大互联网公司的校招笔试就陆续开始了。网易的题向来以“活”著称尤其是有道事业部毕竟手底下有词典、云笔记、翻译、AI教育这些产品线笔试题目往往不光是考算法还会结合真实业务场景来出题。今天就来复盘一份网易2018校招研发工程师有道事业部的笔试卷聊聊每道题背后的考点、解题思路以及从这份卷子里能看出来的出题倾向。先说明一下这份卷子我是在准备秋招的时候做过、整理过的后面也跟几个拿到网易offer的同学对过答案。整份卷子分四个部分客观选择题、算法编程题、系统设计题和开放论述题考试时间120分钟题量不算小现场做的时候节奏感特别重要。下面我按模块拆开讲每一道题都会给出解析思路和踩坑记录。1. 试卷整体结构与考察主线1.1 整体题型分布与分值解读这份试卷总分100分具体分布是这样的题型题量分值考察重点单选10题20分基础知识的覆盖面和精确度多选5题15分知识体系的完整性易错点辨析编程题2题30分算法与数据结构的编码实现能力设计题1题20分系统架构能力与业务理解深度开放题1题15分技术视野与表达逻辑从分值占比就能看出来网易对有道的研发岗要求是“基础扎实 代码过硬 有点架构思维”。选择题占了35分考察范围涵盖计算机网络、操作系统、数据库、Java/C基础、数据结构算法题占总分30分是拉开差距的关键设计题和开放题则是在筛选“能理解业务的技术人”这个后面细说。1.2 为什么说这份卷子很有“有道特色”我当时做完这卷子最大的感受就是它不是纯粹考背诵很多题目都裹了一层业务外衣。比如有道词典、有道云笔记这类产品核心痛点是什么是海量数据存储、是搜索响应速度、是同步一致性。卷子里面的系统设计题就围绕着“笔记同步”来出连选择题里都有涉及HTTP状态码、数据库索引这种跟实际业务强相关的考点。这个思路其实值得所有准备校招的同学注意网易的笔试不太喜欢那种“两耳不闻窗外事”的刷题机器它更希望看到你能把技术原理映射到真实场景里去。所以备考的时候除了刷LeetCode也得花点时间了解目标部门的产品形态和技术栈。2. 选择题模块深度解析2.1 计算机网络部分的考点拆解先说网络这块这部分的题目看着基础但坑特别多。我记得有一道题是考察HTTP状态码的语义区分选项里给了301、302、303、307问哪个状态码表示“临时重定向且请求方法不变”。很多人在这道题上翻车因为平时只记了301是永久重定向、302是临时重定向但没深究307和302的区别。标准语义里302是临时重定向但允许客户端把POST改成GET而307则是临时重定向且必须保持请求方法不变。这道题选307但如果你对RFC规范没有精确记忆很容易选成302。还有一道题涉及TCP的拥塞控制问的是“慢启动阶段拥塞窗口如何增长”。答案是每经过一个RTT窗口翻倍也就是指数增长。这题本身不难但它还有一个变体问法——什么时候退出慢启动进入拥塞避免答当cwnd达到ssthresh阈值时。这种连续追问式的考法在选择题里很常见第一题考“是什么”第二题紧跟着考“下一步会发生什么”本质上是在考察你对协议机制的完整理解而不仅仅是零散的知识点。2.2 操作系统与Linux命令的易错点操作系统部分出了两道比较典型的题。一道是问“进程和线程的根本区别”选项里面有几个干扰项写得特别有迷惑性比如“线程拥有独立的地址空间”“进程间不能通信”。正确答案应该是“进程是系统资源分配的基本单位线程是CPU调度的基本单位”。这道题提醒我们操作系统的基础概念必须吃透定义不能只记结论。另一道题是给了一段Linux命令问输出结果涉及管道、grep、awk的组合使用。原题大概是统计一个日志文件里出现次数最多的IP。核心命令是awk {print $1} access.log | sort | uniq -c | sort -rn | head -n 1考点是uniq -c去重计数、sort -rn按数值逆序排序以及管道的串联逻辑。这道题本身不算难但如果你平时只写业务代码、不怎么碰服务器很可能对awk的字段提取不熟现场推导会花不少时间。建议备考时把常见的Linux文本处理三剑客grep、sed、awk过一遍笔试出现频率很高。2.3 数据库索引与事务隔离级别数据库这边的选择题出了两题一题关于索引失效一题关于事务隔离级别。索引失效那道题问的是WHERE name LIKE %张会不会走索引。答案是不会因为前导模糊查询无法利用B树的顺序查找特性。这个考点几乎是各家笔试的标配每年都考。易错的是WHERE name LIKE 张%是可以走索引的因为B树索引支持范围扫描。出题人经常把这两种写法放在一个题干里作为不同选项务必记清楚。事务隔离级别那题给了四个级别问哪个可以避免不可重复读但不能避免幻读答案是REPEATABLE READ。这里要特别注意MySQL的InnoDB引擎在REPEATABLE READ级别下通过间隙锁Gap Lock基本解决了幻读问题但标准的SQL规范中REPEATABLE READ是不解决幻读的。笔试如果没特别说明数据库引擎按标准规范来答如果题目明确说了InnoDB那就要注意MVCC和间隙锁的机制了。这个细节我在面经里见过好几次算是一个经典的“出题陷阱”。2.4 语言基础与数据结构选择语言基础题考了Java的HashMap底层原理和C的虚函数表机制。HashMap那题问JDK 1.8中链表转红黑树的阈值答案是链表长度达到8且数组长度不小于64。这题容易漏条件很多人只记得阈值8忽略了数组长度限制。如果不满足64的条件会优先扩容而不是转红黑树。为什么是8因为泊松分布下链表长度达到8的概率已经极低这是工程实践里的一个经验值。C虚函数那题问的是含有虚函数的类实例内存布局中虚函数表指针存储在对象的哪个位置。答案是对象内存布局的开头在大多数编译器的实现下。这题属于概念性考察难点在于“多继承下的偏移量计算”但网易这张卷子没有深挖到那一步算是手下留情了。数据结构方面考了平衡二叉树的调整、哈希冲突的解决方法、图的广度优先遍历序列。其中哈希冲突那题列出了四种方法开放定址法、再哈希法、链地址法、建立公共溢出区问哪些属于解决哈希冲突的方法。这题是多选题全选但很多人误以为公共溢出区不是实际上它是教科书明确列出的方法之一只是工程实践中用得少。3. 算法编程题的完整解题思路3.1 题目一字符串去重与排序第一道编程题大概是这样的给定一个字符串去除其中重复的字符保证第一次出现的字符顺序不变然后按ASCII码升序输出。输入输出描述我记不太清了但核心逻辑就是这样。这道题属于典型的“一题多解”题目最简单的做法是用LinkedHashSet去重保持插入顺序然后转数组排序输出。Java里大概这么写public String solve(String s) { SetCharacter set new LinkedHashSet(); for (char c : s.toCharArray()) { set.add(c); } Character[] arr set.toArray(new Character[0]); Arrays.sort(arr); StringBuilder sb new StringBuilder(); for (char c : arr) { sb.append(c); } return sb.toString(); }但笔试现场更推荐用数组标记的写法因为省去了自动装箱和集合的开销思路也更清晰public String solve(String s) { boolean[] seen new boolean[256]; StringBuilder sb new StringBuilder(); for (char c : s.toCharArray()) { if (!seen[c]) { seen[c] true; sb.append(c); } } char[] chars sb.toString().toCharArray(); Arrays.sort(chars); return new String(chars); }时间复杂度O(n klogk)k是去重后的字符数空间复杂度O(1)因为ASCII字符集固定256个。这道题的实际难点不在于算法本身而是你要在“笔试页面的在线编辑器”里手写代码且一次通过。在线编辑器没有IDE的自动补全也不提示语法错误很多人平时用惯了IDE一到笔试环境连Arrays.sort的包名都记不全这类基础API的熟练度一定要提前练。3.2 题目二数组中最长连续递增子序列第二道题是给定一个未排序的整数数组找出其中最长的连续递增子序列的长度。注意这里说的是“子序列”但题目特别说明不需要元素在原数组中连续出现只需要数值连续递增即可比如[100, 4, 200, 1, 3, 2]中最长连续递增的是1, 2, 3, 4长度是4。这道题的经典解法是用HashSet存储所有元素然后遍历数组对于每个元素x如果x-1不在集合中说明x是一个连续序列的起点于是从x开始向上查找x1、x2更新最大长度。这样每个元素最多被访问两次时间复杂度O(n)空间复杂度O(n)。public int longestConsecutive(int[] nums) { SetInteger set new HashSet(); for (int num : nums) { set.add(num); } int maxLen 0; for (int num : nums) { if (!set.contains(num - 1)) { int currentNum num; int currentLen 1; while (set.contains(currentNum 1)) { currentNum; currentLen; } maxLen Math.max(maxLen, currentLen); } } return maxLen; }关键的优化点在“只在序列起点开始查找”这个判断条件。很多人第一次做这道题时会对每个元素都向两边扩展结果时间复杂度退化到O(n²)。虽然数据量不大时也能过但大数组场景下会超时。这道题是LeetCode 128的原题网易基本是直接搬运或者微调了题干所以刷过LeetCode hot 100的同学应该觉得比较轻松。这再次印证了一个备考策略高频题刷熟笔试至少能拿到基础分。3.3 编程题里的隐藏分代码风格与边界处理编程题除了算法本身还有几个隐藏的得分点容易被忽略。第一是边界处理。字符串为空、数组为null、数组长度为1这些边界情况都要考虑到。我当时提交答案时还专门写了一个if (s null || s.length() 0)的判空这其实有两层意义一是防止运行时异常二是让阅卷人看出你有工程意识。网易的笔试不一定全自动判题有些题目会有人工复查环节一个边界处理完善的答案会让面试官对你好感度提升不少。第二是变量命名。不要用a、b、c这种无意义命名用set、currentNum、maxLen这种见名知意的命名代码可读性强哪怕算法不是最优解也容易拿过程分。第三是异常处理。虽然笔试环境一般不会让你处理IO异常但程序的入口方法如果涉及读取输入记得处理异常或者抛出避免编译不通过。4. 系统设计题有道云笔记的同步架构设计4.1 题目要求在说什么设计题是整套卷子里最有意思的部分原题大意是有道云笔记的用户数据需要支持多端同步Web、iOS、Android、桌面端用户在任何一端上的增删改操作都要能实时同步到其他端要求设计一个同步系统的核心架构重点考虑数据一致性、冲突处理和离线编辑场景。这道题说穿了就是设计一个类Dropbox的同步系统。从产品形态上看有道云笔记和Dropbox本质上是一类东西——都是把用户产生的结构化数据在多端之间保持一致。区别在于有道这边还有“笔记内附件”“手写内容”等更复杂的资源类型但核心架构模型是相通的。我当时看到这道题的时候还是挺兴奋的因为这题不是考背诵而是真正考你“有没有做过东西”。4.2 核心设计要素拆解我的回答分了四个层次数据模型、同步协议、冲突处理、离线策略。数据模型上笔记的元数据标题、标签、更新时间、版本号和正文内容HTML或纯文本建议分开存储。元数据放在关系型数据库比如MySQL方便事务性更新和条件查询正文内容放在对象存储里比如OSS或Ceph通过content hash来做内容寻址相同内容只保存一份。每个笔记用全局唯一ID标识每个修改操作都带一个递增的版本号这是后面做冲突检测的基础。同步协议上推荐用“增量同步 版本向量”的方式。客户端每次同步时把自己的版本状态传给服务端服务端把比客户端新的变更记录返回。这里有一个关键点同步不是简单的“Pull全量”而是基于版本号做增量否则数据量大了以后每次同步都是全量拉取性能和流量都扛不住。冲突处理上这是多端同步最核心也最难搞的部分。我的方案是引入CRDTConflict-Free Replicated Data Type无冲突复制数据类型的思想具体来说是使用基于操作的合并策略外加Lamport时间戳定序。对于文本类笔记的编辑冲突采用“操作变换 最后写入者获胜”的混合策略同一段落被不同端同时编辑时以最后提交的版本为准但两端各自新增的内容要保留合并。离线策略上客户端本地维护一个操作日志WALWrite-Ahead Log所有修改先写本地日志再异步同步到服务端。网络恢复后按时间顺序补齐操作日志。这个方案很像Git的分支和合并机制核心思想就是“先记录下来再追求一致”。4.3 这道题到底想考察什么复盘的时候我发现这道题考察的不仅是你知不知道分布式系统那些术语更考察三件事第一你有没有真的思考过“同步”这个词背后的复杂性。很多人的第一反应是“给服务器发请求服务器存一下别人再拉一下”这种理解在产品原型Demo阶段没问题但放到生产环境就完全不够用。真实的同步系统要考虑带宽消耗、弱网环境、手机端电量、服务端吞吐任何一个环节出问题都会导致用户体验下降。第二你有没有取舍能力。方案不一定要最先进但一定要给出选型的理由。我当时选了CRDT方案但同时也指出考虑工程落地成本MVP阶段可以先实现“最后写入者获胜 服务器时间戳”等用户量上来再做CRDT升级。这种“分阶段演进”的意识是面试官比较看重的加分项。第三你有没有接口设计能力。系统设计题不能只画架构图还要落到接口层面。我给出了同步接口的核心设计比如POST /api/sync/push用于提交变更、GET /api/sync/pull?version{version}用于拉取增量并说明了每个请求体的字段设计。这一步能显著提高答案的落地感和说服力。5. 开放论述题与面试官隐藏的考察点5.1 题目和个人答题思路开放论述题问的是如果要给有道词典增加一个“AI智能纠音”功能让用户朗读英文单词后由系统自动判断发音准确性并给出改进建议你会如何设计请从技术选型、数据来源、评估标准、用户体验等角度展开分析。这道题其实已经很像阿里的HR面题了考的是“你如何分析一个从0到1的产品技术方案”。我当时的回答思路大概是这样技术选型上核心是语音识别ASR和音素级对齐评估。第一版可以直接接入成熟的语音识别API识别出用户读了什么然后与目标单词的规范发音做文本比对找出读错的音素。但要实现“音素级纠音”光有ASR不够需要引入音素识别模型Phone Recognition和强制对齐Forced Alignment技术。CMU Sphinx、Kaldi、ESPnet这些开源框架都有相关能力不过工程落地时更推荐基于端到端模型的方案用CTC或Attention机制来输出音素序列的时间戳。数据来源上冷启动阶段可以收集三类数据一是词典本身已有的音标和真人发音库这是基础二是用户授权上传的朗读音频用于模型迭代三是公开的语音数据集比如LibriSpeech、Common Voice用于预训练模型的基座。这里要注意隐私合规问题用户语音数据必须做脱敏处理。评估标准上可以定义两个核心指标音素错误率PERPhone Error Rate和检测准确率Accuracy。PER衡量系统识别用户音素序列的准确性这是底座的指标检测准确率则说明“系统说用户读错了”这件事本身的正确性。后者尤其重要如果系统经常误报用户不仅不会信任还会觉得被冒犯。用户体验上不能只告诉用户“读错了”要说清楚“哪里错了”以及“怎么改”。比如用户把“think”读成“sink”系统要能定位到是/θ/这个音素被误读成了/s/然后通过发音口型图和对比音频来示范纠正。反馈形式一定要可视化、可听化而且要给正向激励否则用户很容易受挫放弃。5.2 开放题的答题框架与避坑建议这类开放题没有标准答案但也有明显的优劣之分。低分答案的典型特征是只写功能描述不写技术方案。比如“做一个纠音功能用户读完后用AI技术判断是否标准给出分数和建议界面要友好”——这等于什么都没有说。高分答案则要体现出“你思考过实现路径”和“你踩过相关方向的坑”。避坑第一点不要堆砌热门词汇。什么区块链、深度学习、强化学习哪里热门就往哪里套反而暴露了你没有深入理解这些技术的适用边界。一个合理的AI纠音方案核心就是ASR 音素对齐 反馈生成这三步不需要任何猎奇的技术词汇。避坑第二点一定要谈评估与迭代。技术方案讲得再天花乱坠如果没有“怎么衡量效果”和“怎么持续优化”的闭环面试官会认为你缺乏完整的产品思维。我当时还特意提了一句“建立badcase回流机制每周抽取用户反馈较差的纠音结果做人工标注用来训练模型”这种细节很加分。避坑第三点表达要有层次。回答时用“第一、第二、第三”或者“短期、中期、长期”的框架让面试官能快速抓住你的逻辑主线。开放题考察的往往是结构化的表达力内容本身倒在其次。6. 备考有道事业部笔试的针对性建议6.1 技术层面的备考优先级综合这份卷子来看我给准备网易有道事业部笔试的同学一个优先级排序第一优先级是“高频数据结构和算法”的熟练度。字符串处理、数组操作、哈希表、二叉树遍历、动态规划入门这些是笔试的出题重灾区。LeetCode hot 100刷两遍剑指Offer整本过一遍算法这块基本能覆盖。第二优先级是“基础知识的精确记忆”。计算机网络、操作系统、数据库的选择题拼的不是广度而是精确度。如果你对TCP三次握手、四次挥手的细节状态名、HTTP状态码的语义区分、事务隔离级别的标准定义都烂熟于心选择题基本不丢分。第三优先级是“业务场景的设计思维”。网易的题喜欢结合自己家的产品出设计题所以备考时可以提前了解网易有道旗下产品的核心功能和技术挑战。有道词典的查词性能优化、有道云笔记的多端同步、有道翻译的并发架构都是不错的模拟设计题。6.2 备考资料与时间分配建议我当时备考用的资料分成三块刷题部分LeetCode 剑指Offer每天保持3~5道题的节奏重点刷数组、字符串、链表、二叉树、DP这些高频tag。基础部分《图解HTTP》《图解TCP/IP》快速过一遍配上牛客网的专项选择题练习。这里特别推荐牛客网它的题库里面有很多互联网公司的真实笔试题出题风格和难度非常接近实际考试。设计题部分多看技术博客的架构文章了解一些经典系统的设计方案。我当时看了很多关于Dropbox同步机制、Evernote数据模型的文章对设计题的思路拓展帮助很大。时间分配上提前一个月开始前两周刷题加基础第三周做模拟卷和设计题最后一周查漏补缺。不建议裸考网易笔试的通过率不算高裸考上岸的概率很低。6.3 笔试现场的时间管理与心态调整再分享一点笔试现场的经验。网易的笔试系统一般是牛客网或者赛码网在线答题题目出来后整体浏览一遍先做有把握的题把该拿的分先拿到。选择题建议控制在35~40分钟内。遇到犹豫不决的题先标记等所有题做完再回头讨论。编程题每道控制在30分钟左右如果30分钟还没思路先放下做后面的设计题和开放题不要在一道题上死磕毕竟编程题一共两道总分30分设计题一道就是20分性价比可能更高。设计题和开放题一定要写完哪怕你觉得自己方案不够完美也要把思路完整地表达出来。这两类题目人工阅卷的成分很大完整的逻辑框架比一个孤立的炫技点更有价值。心态上网易笔试的难度在互联网公司里属于中上遇到不会的题很正常关键是不要慌。我当年做设计题的时候思路卡了大概五分钟深呼吸之后把题目重新读了一遍把已知条件列出来然后从“数据怎么存”开始一步步推导思路自然就顺了。笔试考察的不仅是知识储备也是你在限时压力下拆解问题的能力。7. 后续面试环节的衔接准备笔试只是第一关通过之后还有面试环节而且网易面试往往会追问笔试中的内容。比如你笔试时写了“用CRDT解决同步冲突”面试官很可能在二面的时候让你展开讲讲你对CRDT的理解包括它的数据结构、与OT算法Operational Transformation操作转换的对比、以及你们项目里有没有类似的实践。我建议所有通过笔试的同学在收到面试通知后的第一时间把笔试的每一道题都重新复盘一遍尤其是设计题和开放题要把“当时写的方案”扩展成“现在能讲清的方案”。面试官问“你笔试时提到XXX能详细说说吗”如果你能做到脱口而出而且比笔试时写得更深入更完整那会让面试官觉得“这个人是真的肚子里有货”。另外笔试过程中如果有让你印象深刻的题目——比如某道算法题想了很久才做出来某道选择题在两个选项之间纠结了很久——可以记录下来面试的时候主动聊一聊你的思考过程。面试官其实很喜欢听到真实的做题心路因为这能展示你的思维方式和抗压能力比背诵式的自我介绍有价值得多。我在面试的时候主动提了一道设计题里“离线同步一致性”的思考过程就看到面试官点了点头后面聊得明显顺畅了很多。回到这份2018年的笔试卷本身虽然时间过去几年了但网易出题的大思路并没有变基础扎实、算法熟练、有业务意识、有逻辑表达力。把这四样准备好不管遇到什么年份、什么部门的卷子都会多几分底气。