
手里拿到这份“网易2016研发工程师笔试题二”的时候我正在准备当年的秋季招聘。说实话网易的笔试在互联网公司里算是有辨识度的不搞偏题怪题但基础考察得非常细稍不注意就会在选择题上连环翻车。整套题做下来我的感受是——它不像是在为难你而是在检验你有没有真正理解计算机基础以及面对陌生问题时能不能快速建模。这篇博文就结合这套题聊聊它的考察逻辑、我当时的解题过程以及后来我回看时发现的很多值得反复琢磨的细节。这套题适合谁看两类人。一类是正在准备研发岗校招的应届生另一类是工作一两年后想回头查漏补缺的朋友。前者可以用它做模拟训练后者可以从中找到很多“当年没想明白”的答案。我尽量把每一道有代表性的题目都拆到“为什么这么考”的层面而不是停留在“答案是什么”。1. 这套题的整体设计与考察思路1.1 题型分布与分值权重先从卷面结构说起。网易2016研发工程师笔试题二延续了网易校招笔试的一贯风格题型上主要分两块选择题和编程题。选择题覆盖数据结构、算法、操作系统、计算机网络、C/C语言基础偶尔会出现一两道数据库和智力题编程题则是Online Judge模式给一个代码框输入输出按题目要求实现考察的是实际写代码的能力。从我记忆中的题量和分值来看选择题大概20道左右每题3到5分不等编程题2到3道每道20到25分。这个分值比例很有意思选择题看起来单题分值低但数量多、覆盖面广基本决定了你能否进入下一轮而编程题单题分值高是拉开差距的关键。也就是说这套试卷的筛选逻辑是“基础不过关直接淘汰代码能力强的人靠大题翻盘”。对比一下同年其他大厂的笔试题网易的难度属于中等偏上。选择题没有明显的脑筋急转弯但很多题目会在选项里埋“近似项”专门坑那些只背概念、不理解原理的候选人。编程题则更偏向实际工程中的常见问题不会让你去证明什么复杂的数学定理。1.2 从出题逻辑反推筛选标准我刷完这套题之后最大的感触是网易笔试不是要招“刷题机器”而是要招“基础扎实、能解决实际问题的工程师”。从出题逻辑上可以反推三点。第一选择题里频繁出现“下列说法正确的是”这种多选变体而且错误选项往往只是把某个条件改了一个字。比如操作系统里进程和线程的区别选项会在“共享地址空间”和“共享全局变量”之间做文章看起来都对但考察的其实是微观层面的内存管理机制。这说明出题人希望候选人理解概念之间的边界而不是死记硬背。第二编程题的输入输出格式特别强调边界条件。我记得有一道链表相关的题目测试用例里包含了空链表和只有一个节点的边界情况。很多人在IDE里能跑通但一提交就报错就是因为没处理空指针。网易的题目不会明说“你要注意边界”而是通过测试用例让你自己踩坑。第三整套题对时间管理的要求很高。选择题如果每道都纠结到两分钟以上编程题基本就写不完了。这说明在真实的研发工作中快速判断问题优先级和快速试错的能力同样重要。笔试不是一个完美的评估手段但它确实能在短时间内暴露一个人的思维习惯。2. 选择题核心考点拆解计算机基础才是重头戏2.1 数据结构与算法栈、二叉树、哈希的经典陷阱数据结构的选择题是整套试卷中性价比最高的部分考点非常集中。栈和队列、二叉树遍历、哈希冲突处理、排序算法复杂度和稳定性这几类题目几乎每年必考2016年这套题也不例外。我印象很深的一道题是给定一个入栈序列问以下哪个出栈序列是不可能的。这种题看上去简单但其实考察的是对栈操作过程的理解深度。很多人直接背“后进先出”然后看到某一个选项就以为是正确答案却没有在草稿纸上把入栈出栈过程完整推演一遍。正确做法是按入栈顺序逐个压入同时判断栈顶元素是否等于出栈序列的当前指针能出就出不能出就继续入最后看栈是否为空。整个过程是确定性的只要推演一遍答案不可能错。二叉树这边网易爱考的是“已知前序遍历和中序遍历求后序遍历”或者“完全二叉树的节点编号特性”。前者考验递归拆解能力后者考验对二叉树性质的数学理解。我当时复习的时候把前中后序遍历的递归与迭代版本都写了一遍做题就很快。特别提醒一下迭代版本不要只记代码一定要理解栈里保存的是什么——它保存的是“待处理的状态”而不只是节点本身。哈希表的题目通常会从冲突处理切入比如开放定址法和链地址法在查找成功和查找失败时的平均查找长度怎么算。链地址法相对直观开放定址法需要注意“删除元素时要标记而不是真正清空”否则会影响后续查找。这些细节在课本上就是一句话但在笔试里就是一道4分的题。2.2 操作系统与网络进程、并发和TCP状态机操作系统题是很多非科班候选人的噩梦网易似乎也清楚这一点所以他们特别喜欢在这里设置区分度高的题目。进程和线程的区别、死锁产生的四个必要条件、虚拟内存和页面置换算法这些是必考知识点。有一个高频问题我建议大家务必理解透彻进程间通信方式有哪些管道、消息队列、共享内存、信号量、Socket每种方式的应用场景和局限性是什么。网易的题不会直接问“有哪些”而是给一个场景让你选合适的通信方式。比如“两个进程需要传输大量数据要求实时性高”共享内存显然比管道合适但共享内存需要同步机制这时候信号量就是加分项。网络部分TCP三次握手和四次挥手的过程必然是重点。2016年这张卷子里的相关题目选项围绕着SYN、ACK、FIN这几个标志位和状态变迁展开。说实话死记状态名LISTEN、SYN_SENT、ESTABLISHED、FIN_WAIT_1、TIME_WAIT没多大意义你得理解为什么需要TIME_WAIT——为了保证对方收到自己最后一次ACK也为了让旧连接的报文在网络中消失避免影响新连接。理解了设计原因选项怎么变形你都能识别。我在复习网络部分时还有一个心得不要把TCP和UDP的区别只记在“可靠vs不可靠”这个层面。出题人喜欢问“哪些应用适合用UDP”如果你只背了“视频通话、直播”那么遇到“需要实时性但对丢包不敏感”的场景变体你还是会选错。要建立起“TCP面向字节流、UDP面向报文”这个底层视角很多应用层选择就变得顺理成章。2.3 C/C语言细节指针、内存与关键字网易研发岗笔试几乎绕不开C/C因为网易很多后端和客户端团队都在用C。这块的选择题主要考察指针与引用的区别、const的作用、static变量的生命周期、内存对齐、内存泄漏。让我印象最深的是内存对齐。题目给一个结构体里面有一个char、一个int、一个short问sizeof是多少。如果不了解对齐规则你会直接算出7但正确答案是12在32位机器上。原因在于编译器会按照默认对齐数把成员变量填充到对齐边界上。这类题不偏不怪但它检验的是你有没有真正写过底层代码而不只是用过高级语言。还有一个容易踩坑的点const int* p、int* const p、const int* const p三者的区别。左定值、右定指这句话背下来很容易但你得能分辨出题人给出的具体代码里哪一个操作是合法的。我建议把这类题目放到实际的编译环境里跑一遍看到编译报错后再回来分析印象会深很多。2.4 逻辑与智力题不只是考验智商除了计算机基础网易的试卷里往往还夹杂着一两道逻辑推理题。2016年的那张卷子我印象中有一道关于“谁在说谎”的题目四个人的陈述中只有一个人说真话让你判断是谁做了某件事。很多人觉得这种题和编程没关系但实际上它考察的是状态枚举和条件约束的能力。逻辑题和编程题在思维层面是相通的——你在用一个有限的搜索空间里做约束满足。我的经验是遇到这类题目不要靠脑补直接用表格把每个人的陈述是真是假列出来再根据“只有一个真”或“只有一个假”的条件逐一排除。把复杂问题转化成表格遍历这是工程师的基本素养。3. 编程题实操从读题到AC的完整链路3.1 第一类题链表与指针操作网易的编程题通常不会给纯模板题它会把一个常见问题包装一下让你自己抽象出模型。我记得当时好像有一道链表逆序输出的题要求不修改链表结构从尾到头打印每个节点的值。这道题考察的知识点其实很朴素栈、递归、链表遍历。最容易想到的解法是遍历链表把值存进数组最后逆序输出。这在功能上完全没问题但面试官和OJ看的是你能否主动优化空间。用递归可以隐式地使用系统栈代码只有几行void printListFromTailToHead(ListNode* head) { if (head nullptr) return; printListFromTailToHead(head-next); printf(%d , head-val); }但这里有一个隐藏问题如果链表很长递归会导致栈溢出。所以工程上更稳妥的解法是用额外的显式栈void printListFromTailToHead(ListNode* head) { stackint st; for (ListNode* p head; p ! nullptr; p p-next) { st.push(p-val); } while (!st.empty()) { printf(%d , st.top()); st.pop(); } }这两种解法OJ都能接受但你在答题时最好写显式栈版本因为判题系统不会管你的递归是否栈溢出但面试官后续追问一定会提到。笔试不只是写代码更是在展示你的工程判断力。3.2 第二类题动态规划的状态定义如果说链表题是开胃菜那么动态规划题就是整张卷子的主菜。网易的DP题目不会一上来就是最大子序列和这种烂大街题型它更喜欢把DP包装在某种游戏或操作规则里需要你先从问题中提取状态。我还记得当时有一道和“最小代价”相关的题目大概是每次操作可以选择某个方向移动移动代价不同求从起点到终点的最小总代价。这类题目在LeetCode上通常叫“最小路径和”变种但它多了一个状态你走了多少步、用了多少次某种特殊操作。也就是说状态不只是坐标(x, y)还需要一维用来记录特殊操作次数。我当时犯过一个错误只定义了二维dp数组结果某些测试用例过不去。后来才意识到状态定义不完整会导致最优解被丢弃。正确的定义方式应该是有三个维度比如dp[i][j][k]表示到达(i, j)且已经使用k次特殊操作的最小代价。状态转移时你可以走普通路径也可以走特殊路径两种转移分开做最后取最小值。再补充一个细节DP题的初始化不要一律用0。最小值问题往往要把dp初始化为一个很大的数比如INT_MAX / 2防止在加法时溢出。这个“除以2”的小技巧也是经验之谈直接用INT_MAX去加一个正数就会变负数答案就会离谱。3.3 编程题的代码规范与边界条件自测写编程题的时候代码规范会影响OJ的判分吗不会。但会影响你后续面试的观感吗会。在面试轮里面试官会调出你的笔试代码来看如果你的变量名是a、b、c没有注释缩进混乱即便AC了面试官内心也会打一个问号。我给自己定的规范是函数名用小驼峰变量名用有意义的名词算法主干最多出现一个helper函数。在笔试的有限时间里这种规范能帮你减少低级错误。更重要的是写完代码后要习惯性地检查几个边界条件输入为空指针或空字符串数组长度为0或1数值达到上限或下限循环边界是 n还是 n养成这个习惯之后我后来在线笔试的AC率稳定了很多。很多题不是不会做而是在边界条件上被扣分白白浪费了前面的努力。4. 查漏补缺与整体复盘这套题让我重新认识了基础4.1 从错题里找到知识盲区做完这套题以后我没有急着对完答案就去刷下一套而是把每道错题都记到了一份表格里。表格的列包括题目模块、考点、我的错误选项、正确思路、对应复习资料。这么做的原因很简单校招笔试是一个连续的过程你需要在一套又一套卷子之间看到自己的进步。如果只是追求刷题数量同一类错误会在下一套试卷里反复出现。比如我在多道选择题里都栽在“进程间通信方式的选择”上说明我理解的不是这个知识点而是片面的记忆那就是盲区得回头翻操作系统的进程管理章节。建议你们也试试这个办法哪怕只是用Excel做一张简单的表。到了秋招后期你会发现真正让你提分的不是做了多少新题而是把旧题里的盲区补上了多少。我自己到了面试前一周复习的基本就是这份错题表效率很高。4.2 从题目反推复习优先级这套题还帮我看清了复习的优先级。当时我的时间很紧张但如果按照“考频最高、最容易拿分”来排一定是数据结构特别是链表、栈、树 基础算法排序、二分、DP 操作系统进程、内存、死锁 计算机网络TCP/UDP、HTTP C/C语言细节 数据库/智力题。这个优先级在网易的试卷里非常明显。链表和排序几乎就是送分题只要你认真准备过一定不能丢分操作系统和网络是拉分项数据库和智力题则属于“nice to have”不会做也不要慌把前面守住就行。所以建议大家不要一上来就抱着《深入理解计算机系统》啃那是长期功夫校招笔试前更需要的是短期的考点扫描。先按考频把高频考点过一遍再用真题做查漏补缺效率会高很多。我当时就是先用一周把高频考点过完然后用包括网易这套题在内的真题不断检验稳步提升。5. 考场上的时间分配与应试技巧5.1 选择题要控制单题耗时这套卷子对我来说最大的挑战不是难度而是时间。如果选择题平均每题超过2分钟编程题的时间就会被严重挤压。我的策略是先快速扫描一遍题目把有把握的题先做完拿不准的题做个标记等编程题写完后再回头慢慢想。为什么这样安排因为编程题的20多分往往比一道选择题的3分更容易拿到手。选择题可能你纠结五分钟还是选错编程题只要思路清晰十分钟就能写出大部分代码。先把确定性高的分数收入囊中再用剩余时间攻克不确定的选项这是最稳的策略。实际操作中我会在试卷发下来后的前两分钟快速浏览所有题目。如果发现某道选择题完全看不懂考点我会直接跳过绝不恋战。做编程题时如果卡了超过20分钟我也会暂时放弃回头检查选择题。笔试不是竞赛目标是总分数最大化不必追求每道题都做出来。5.2 编程题的输入输出陷阱网易的编程题输入输出部分有一个非常经典的坑输入可能包含多组测试数据。有些同学习惯只读一组数据写完代码本地测试通过但提交后只能通过极少用例。我第一次参加在线笔试时也踩过这个坑后来养成了一个习惯无论题目有没有明说都按“循环读入直到EOF”的框架来写。int n; while (scanf(%d, n) ! EOF) { // 处理一组数据 }另外输出格式也值得注意。如果题目要求“每个结果占一行”就不要画蛇添足多打空行如果题目要求“每个结果后有空格”那最后多出的空格不算错但能不犯就不犯。代码的正则式输出可以减少很多无谓的提交失误。还有一个小技巧在笔试题里如果题目要求输出一个浮点数并指定了小数点后位数用printf(%.2f)而不是手动计算舍入。手动算浮点数精度非常容易出错交给格式化输出函数处理是最可靠的选择。5.3 心态管理遇到不会的题怎么办考试时最怕的不是题目难而是心态崩了。网易这套题的二卷部分我记得考到后面有几道涉及具体Linux命令和C内存布局的题目当场想不起来是很正常的。这时候我会先做一次深呼吸告诉自己别人大概率也不会这道题的分我不要了但后面还有更值得拿的分。把注意力从“这道题不会”转移到“我还能做对哪些题”上是很有效的应试策略。笔试考的不仅仅是知识储备还有在压力下快速分配注意力的能力。后来去网易面试时面试官也会问“你在笔试中遇到不会的题时怎么处理”这其实就是在考察你的压力和挫败应对方式。6. 题目之外的思考网易到底在招什么样的人这套题做透之后我不仅收获了知识上的补全也对“网易想要什么样的研发工程师”有了更清晰的认识。从笔试题来看网易最看重的是三个特质基础扎实、思维清晰、工程意识。基础扎实体现在选择题里那些平时不起眼但很重要的知识点比如内存对齐、TCP状态变迁都在反复出现。思维清晰体现在编程题和逻辑题里你需要在有限时间内把模糊的问题转化为明确的模型再用代码实现。工程意识则体现在代码规范和边界条件的判断上——一个连输入边界都不处理的人很难让人相信他能写出健壮的生产代码。我后来入职后也参与过几次校招笔试的策划发现出题人的思路其实很一致每一道题都要能够预估“会做的人大概占多少比例”。如果一道题只有个位数的人能做出来那它就不是好的笔试题因为它没有区分度。网易这套2016年的笔试题恰好处于难度和区分度都比较合理的区间这也是它至今仍被很多学弟学妹当作模拟题的原因。我个人在刷完这套题之后的体会是笔试题目本身的价值不只在“分数”而在于它帮你把所有计算机核心知识重新梳理了一遍。如果你能把一套试卷的每个选项都搞懂背后的原理那它的价值至少是十套盲目刷题的卷子加起来。希望这篇拆解能帮到正在准备校招的你也欢迎你把这套题的更多细节拿出来一起讨论。