ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

2017网易内推笔试复盘:算法、操作系统与网络考点深度解析

2026/8/30 12:57:57 拓冰建站 浏览量
2017网易内推笔试复盘:算法、操作系统与网络考点深度解析 2017年内推笔试技术面之外的第一道硬门槛。很多人以为内推就是简历递进去、面试聊聊天实际上内推名额照样要过一轮技术笔试而且这一轮刷人比例一点不比校招统考低。网易有道那年的内推选择题我印象特别深——单看每道题的知识点都不算冷门但组合在一起覆盖面相当广从C内存布局到Java并发、从TCP拥塞控制到数据库索引、从经典算法到数据结构变体基本把计算机基础课里最核心的几块都点了名。这篇文章我想回头复盘一下那场笔试里的典型题目不是简单地贴答案而是把每道题背后的考察逻辑和做题时容易踩的坑讲清楚。无论你是在准备内推笔试还是纯粹想检验一下自己的基础功底这份复盘应该都有参考价值。尤其那些看着会、一做就错的题我会重点拆一下错因。1. 内推笔试到底在考什么2017年的题型结构与备考思路先说一个很多人容易忽略的背景内推笔试和正式校招笔试出题侧重点是有区别的。正式校招要面向全年级上万名候选人题目会偏向基础、通用难度曲线比较平缓保证大部分人都能做出一部分。内推批次的题目则更任性一些因为候选人数量少、质量预期高出题人没必要照顾绝大多数人的体验反而会故意在一些容易混淆的细节上埋坑。有道2017年内推选择题当时考的科目大致如下科目大致题量重点方向数据结构与算法8-10题二叉树、动态规划、排序、字符串处理C / Java 语言特性6-8题内存管理、虚函数、集合类源码、并发操作系统4-6题进程调度、死锁、内存分页计算机网络4-5题TCP、HTTP、拥塞控制数据库3-4题索引结构、事务隔离级别、SQL优化概率论与逻辑推理3-4题排列组合、期望计算、智力题这个结构其实反映了有道作为一个互联网产品公司的技术画像客户端、服务端、算法、测试都有岗位所以要靠一套笔试去粗筛所有方向的人。算法和语言特性占比最高这是硬通货操作系统和网络是区分度最大的部分——不是因为它难而是因为很多人真没认真复习这两门课。我当时的备考策略很简单把大学四门核心课数据结构、操作系统、计算机网络、数据库的笔记过了一遍再把常见的算法模板手写了一遍。这个策略在笔试当天被证明是对的因为选择题考的不是你会不会写代码而是你对概念理解的准确度。理解得越细做题越快那些好像是这样的模糊判断在选择题里几乎必错。2. 算法选择题的实战拆解四道典型的看似简单实则杀招题算法在选择题里通常不会让你手写完整代码但会给你一段代码片段或者一个算法描述让你判断复杂度、输出结果或者选出正确结论。我在那次笔试中遇到的几道题现在回头来看很能代表这类题的套路。2.1 数组与滑动窗口边界条件才是真正的考点第一道让我停下来多看了两遍的题是给定一个整数数组nums和一个目标值k判断数组中是否存在两个不同的索引i和j使得nums[i] nums[j]且|i - j| k。这是个典型的滑动窗口题解法是用哈希表维护窗口内的元素。表面上看这题只需要维护一个哈希表遍历数组每次检查当前元素是否在表中。但题目选项里经常出现的坑是很多人直接用哈希表存元素最后出现的位置而没有做窗口大小约束。如果这样写遇到重复元素但距离超过k的情况就会误判。正确的做法是边遍历边清除窗口外的元素或者存索引并比较距离后更新位置。我当时做题时的思路是先用最直白的想法推一遍——遍历到下标i时哈希表里存的应该是下标i-k到i-1范围内的元素。所以每次要先从表里移除下标为i-k-1的元素如果存在再判断当前元素是否已在表中。这样问题就变成了一个纯粹的模拟。这种题真正的考点不是哈希表本身而是你能否在脑内走一遍边界流程想清楚什么时候加入、什么时候移除、什么时候判断。2.2 动态规划状态定义才是胜负手有道笔试对动态规划的偏爱很明显选择题里出现了一道最长公共子序列的变体题。题目不是直接问LCS长度而是给定两个字符串问如果允许删除若干字符最少删除多少个能让两个字符串相等。这题本质上是LCS的换皮最小删除数 两个字符串长度之和 - 2 * LCS长度。但作为选择题它给出的选项往往有迷惑性。有的选项等于两个字符串长度的差有的选项等于较短字符串长度减去LCS长度只有正确选项才是上面那个公式。这个题的考点有两个层面。第一层是你能不能看出来它和LCS的关系第二层是你知不知道LCS的状态转移方程。我对动态规划题的建议是看到题先别急着列方程先问自己我要求的东西和哪个经典问题本质相同。如果你能把一个新问题归约到一个已知问题上这道题的难度就降低了一半以上。2.3 二叉树遍历递归与迭代的边界问题有道向来喜欢考二叉树那年出现了一道关于非递归后序遍历的选择题。题目给了四种遍历方式的代码片段让你选出哪一段是后序遍历的实现。非递归后序遍历是三种非递归遍历里最容易出错的。前序和中序用栈的思路相对直观后序需要一个额外技巧——记录上一次访问的节点或者用两个栈。错误选项的写法通常是用中序的逻辑改几个顺序看起来像后序实际输出顺序是错的。我记得正确答案应该是用两个栈实现的版本第一个栈按根-右-左的顺序压入节点弹出一个节点就压入第二个栈最后依次弹出第二个栈即可得到左-右-根的后序序列。这个思路我review的时候专门记过一笔因为它比记录前驱节点的方法更不容易写错。平时刷题时遇到这种需要记技巧的知识点建议单独整理成一个文档笔试前一晚扫一遍比临场想高效得多。2.4 复杂度分析别被看起来很快的代码骗了还有一道题是给了一个嵌套循环外层循环n次内层循环每次从1加到外层变量的平方根问总的时间复杂度。答案是O(n^1.5)。这个结论对很多人来说并不直观因为这代码一眼看过去好像是O(n^2)但内层的循环上限不是n而是sqrt(i)所以总复杂度是前n个自然数平方根之和积分估算为O(n^1.5)。这种题的坑在于你如果不用数学推导而靠直觉去猜很容易被选项里的O(n^2)带走。我做复杂度题的习惯是把循环的累加表达式写出来然后用积分或者求和公式去估。遇到这种看起来像O(n^2)但实际不是的情况动手算一遍就绝对不会错。选择题真正比拼的不是你会不会算而是你愿不愿意在考场上花这30秒去算。3. 软肋科目复盘操作系统与网络的区分度大题算法题只要平时刷题量够其实不太容易失分。真正让我在笔试后出了一身冷汗的是操作系统和计算机网络的几道题。当年我对这两门课的复习深度远不如算法结果它们在选择题里的区分度恰恰最高。3.1 死锁的四个必要条件不是只有了解就够了有一道题是给你四个关于死锁条件的描述让你选出错误的那个。四个条件分别是互斥、持有并等待、不可剥夺、循环等待。错误选项往往把循环等待描述成系统中有多个进程同时等待同一个资源——这个说法其实描述的是资源竞争不是循环等待。死锁的四个必要条件是经典基础但考法可以很刁。关键在于理解为什么四个条件缺一不可互斥保证资源不能被共享持有并等待导致进程可能带着资源去等别的资源不可剥夺让已经持有的资源不会被动释放循环等待则是这些条件共同导致的拓扑结构。选择题里只要有一个条件被偷换概念就容易选错。建议是把每个条件都找一个生活中的类比记下来比如两个人互相等对方手里的笔却谁也不肯先放下——这就是持有并等待加循环等待的组合。3.2 TCP拥塞控制慢启动和拥塞避免的边界条件网络题里出现了一道让按顺序排列TCP拥塞控制阶段的选择题。正确顺序应该是慢启动、拥塞避免、快重传、快恢复。这个顺序不难难的是题目把快重传和拥塞避免的顺序调换了一下还显得很合理。我当时判断的关键在于快重传是当收到3个重复ACK时立即重传丢失报文段它本质上是一种对丢包的快速响应机制发生在拥塞避免之后。而快恢复则是配合快重传使用的把拥塞窗口减半而不是降到1。这个知识点的逻辑链是拥塞避免阶段用来试探网络的承载上限一旦发现丢包立即转入快重传快重传的立即重传和窗口减半策略就是快恢复。整条链路合在一起才构成了TCP对拥塞的完整应对方案。3.3 进程与线程的内存共享边界关于进程与线程的区别有道考了一道比较细的题在同一个进程的多个线程之间哪些东西是共享的哪些是私有的。正确选项应该是堆、全局变量、文件描述符共享栈、寄存器、程序计数器不共享。很多人在栈和堆的归属问题上会犯迷糊。实际上每个线程都有自己独立的栈因为栈上存的是局部变量和函数调用信息线程的执行路径是独立的所以栈必须独立而堆是动态分配的内存区域多个线程可以同时在其中创建对象所以是共享的。顺带一提程序和寄存器也是线程私有的因为每个线程有自己的执行上下文。这道题的教训是讨论共享还是私有时要基于线程的执行模型去推不要死记硬背。3.4 数据库索引为什么数据量小就不建索引是对的数据库考了一道关于索引的题问在一个只有几百行的表上建立索引是否一定提升查询性能。答案是否定的。原因在于索引本身需要额外的存储空间和维护成本插入、更新、删除操作都要同步更新索引。如果表的数据量很小全表扫描的时间完全可以接受而建立索引后每次写操作都要多维护一棵B树反而得不偿失。这个例子放在技术笔试里其实藏着一个更深的考察点你是否有根据数据的量级选择方案的工程直觉。再好的优化手段在数据量不够大时都是负优化而一个查询再怎么慢只要数据量小效率也都足够。这种看数据量说话的思路对后续做系统设计题会很有帮助。4. 做题策略复盘从时间分配到排除法的高阶用法笔试考的不只是知识储备还有临场的策略。内推的选择题虽然不如编程题耗时但35-45道选择题要在90分钟内做完平均每道题只有2分钟多一点时间压力并不小。我说说当时实际用得比较顺的方法。4.1 时间分配先做秒杀题再啃硬骨头我的原则是整套卷子按顺序做但遇到卡壳的题先标记绝不恋战。选择题的特点是总分由大部分中等题和小部分难题构成中等题的性价比远高于难题。一开始就死磕一道复杂算法题会导致后面大量本该拿分的基础题没时间做这才是最可惜的。我当时的节奏大概是前10分钟做完所有语言基础题和简单数据结构题中间40分钟处理中等难度的算法题和操作系统题剩下的时间全部留给几道复杂的算法题和智力题。这样一来即使最后两道题没做出来前面该拿的分也基本都拿住了。4.2 排除法的高阶用法找绝对错误而不是找正确做选择题时我习惯于先排除绝对错误的选项而不是先找正确选项。原因很简单正确选项可能因为知识点记忆模糊而不敢确定但错误选项往往有明显的漏洞——比如把必要条件说成充分条件、把时间复杂度往小了写、或者把概念的主体张冠李戴。举个例子如果一道题的选项里有进程的粒度比线程小这种表述基本可以立刻排除。这种绝对错误选项通常不需要你知道正确答案就能识别。排除掉两个绝对错误的选项后剩下两个选项里再挑正确率会高很多。这个方法在面对概念辨析题时特别有效因为出题人往往会编造一个看起来像那么回事、实则逻辑不成立的说法。4.3 遇到完全没见过的题怎么处理内推笔试里偶尔会出现一两道知识盲区的题比如冷门的排序算法复杂度、不常用的STL容器实现原理、或者一个从没见过的概率模型。遇到这种题我的处理方式是先用已有知识推断一个最合理的答案然后标记出来不再回来纠结。为什么不要回头纠结因为回头重做这道题时你并不会突然多出相关知识大概率还是同样的思路。与其反复消耗时间不如把时间留给后面能稳拿分的题。我复盘时发现当时凭直觉蒙的几道题错的比例并不比答题区域里纠结半天的题高多少——纠结很多时候并不会带来更高的正确率只会浪费更多时间。5. 复盘之后的核心收获这套题目真正教给我的事考完回想整套选择题我最深的体会是网易那年的题目没有什么偏题怪题所有考点的范围都在教科书上但区分度极高。它会换着法子考察你对基本概念的准确理解而不是模糊印象。举几个我在复盘时意识到的点算法的复杂度不能靠猜必须会算。那些看起来O(n^2)实则是O(n^1.5)的嵌套循环表面上是在考数学背后是考察你是否愿意动笔。电脑前的工程实践里性能分析同样是靠测、靠算而不是靠感觉。操作系统和网络的基础知识远比想象中重要。笔试里它们可能是几道选择题但在面试环节这些知识点会以方案讨论的形式反复出现。一个不理解死锁四个条件的人怎么可能设计出无死锁的并发系统数据库题的工程味很浓。索引那道题考察的数据量小就不建索引的判断本质上就是工程取舍——优化不是越多越好而是要在合适的场景、合适的数据量下做合适的事情。如果让我总结一套针对这类内推笔试的准备方案大概是下面几条把四门核心课的知识点过一遍重点看概念辨析和边界条件而不是泛泛地看定义算法题保持手感尤其是动态规划、二叉树、滑动窗口这些高频考点做题时严格计时训练自己在单题上的时间控制能力做完一定要复盘特别是那些看着会但做错了的题错因往往比正确答案更有价值。笔试只是第一关但这一关筛选的并不只是会多少知识还包括你在有限时间内有多少分。那些平时基础扎实、遇题不慌的人在这类考试里总是能稳定发挥。希望这份复盘能帮你少踩几个坑。