ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

网易2018校招C++开发笔试题全解析:核心考点、编程题与避坑指南

网易2018校招C++开发笔试题全解析:核心考点、编程题与避坑指南 一提起网易的C/C开发岗校招笔试不少同学第一反应就是“题量大、范围广、代码题刁钻”。我当年备考时也刷过这份2018年的笔试卷后来陆陆续续帮学弟学妹做过复盘发现它考察的点其实非常集中并没有想象中那么玄乎。今天我就把这份“网易2018校园招聘C开发工程师笔试卷”掰开揉碎聊一聊从考情分析、核心考点拆解到编程题实战思路再到答题时的坑和技巧一次性讲清楚。无论你是正在准备秋招的应届生还是想查漏补缺的C/C方向开发者这篇文章都能给你一份可直接照做的复习路线。1. 整体考情分析与备考策略1.1 这份笔试卷到底考什么网易的校招笔试向来不是单纯考“背八股”而是重点考察候选人能不能用C/C解决真实工程问题。2018年这份C开发工程师笔试卷整体可以分成三块基础选择/填空题、程序阅读与改错题、手写编程题。第一块主要覆盖C语言语法细节、指针与内存、关键字语义、位运算、操作系统和网络基础第二块要求你读懂一段给定的C代码指出输出结果或找出逻辑错误第三块是两道左右的算法/数据结构编程题需要用C/C写出可编译运行的代码。从知识权重来看C语言基本功占比最高大概能到40%-50%。指针、数组、结构体、内存管理这些是绝对的重点。其次是数据结构与算法链表、二叉树、排序、动态规划这些经典题型会以编程题或选择题的形式出现。操作系统进程线程、死锁、虚拟内存和网络TCP/UDP、HTTP加起来大概占20%-30%。Linux基本命令和简单Shell脚本也偶尔会出现主要考察你有没有真实开发环境的使用经验。1.2 网易出题风格的特点和腾讯、阿里相比网易的C/C笔试试卷更偏“工程向”。什么意思就是说它不太喜欢让你证明一个复杂的数学定理也不喜欢在题干里藏着特别偏门的知识点而是喜欢给你一段实际业务中会出现的代码让你分析问题、排查Bug。举个例子它可能给你一个多线程环境下操作共享链表的代码问你会不会出问题、怎么改。这种题考察的不只是语法还有你对内存模型、并发控制、异常流程的理解。另一个特点是“陷阱设置在细节里”。比如sizeof和strlen的区别、指针自增的求值顺序、结构体内存对齐、大小端转换这些都是选择题的高频考点。你觉得自己会但真到考场上稍微一急就容易选错。我见过不少人挂在“有符号和无符号比较”这种看起来很简单的问题上就是因为细节没抠透。1.3 备考重点与复习规划建议如果你现在离笔试还有一到两个月我建议按这个节奏来准备第一周把C语言语法彻底过一遍重点复习指针、数组、字符串、结构体、内存管理、预处理指令、常用库函数第二周集中刷数据结构基础题链表操作、栈和队列、二叉树遍历、排序算法要做到随手就能写第三周专项攻克操作系统和网络考点进程与线程的区别、死锁条件、虚拟内存、TCP连接管理这些要能用自己的话讲清楚第四周做真题模拟和限时训练顺便复习一下Linux常用命令和GDB调试。复习时一定要动手写代码不要光看。我在面试别人时发现很多候选人“眼高手低”笔试选择题答得不错一到手写编程题就卡壳。建议准备一个本地环境Windows上装MinGW或直接用VS Code配置C/C环境Linux/macOS直接用gcc/clang每天手写两三道题跑通为止。写完之后再看看有没有可以优化的地方比如边界条件、内存泄漏、时间复杂度。2. 核心基础考点深度拆解2.1 指针与内存笔试的重灾区指针是C语言的灵魂也是校招笔试里最容易让人翻车的部分。网易这份试卷里指针相关题目几乎无处不在既有选择题也有阅读题。“指针和数组的关系”是必考项比如int a[5]; int *p a;p1和a1的区别sizeof(a)和sizeof(p)的区别这些一定要烂熟于心。另一个高频考点是“二级指针”和“指针作为函数参数”。我印象很深的一道题写一个函数在函数内部为指针分配内存要求函数外也能使用这块内存。如果参数传的是值拷贝函数外的指针仍然是NULL必须传二级指针或返回指针。这个知识点很多人理解不到位笔试时直接输出崩溃或者段错误。内存管理这部分malloc/free和new/delete的匹配使用是常客。网易的题不会直接问你“这两组有什么区别”这种八股题而是给你一段代码里面有malloc了但不free、或者free之后还继续访问的骚操作让你判断程序行为。这里有一个关键认知free只是释放内存并不会把指针置NULL所以释放后继续访问是典型的“悬空指针”问题笔试考的就是你能不能识别出来。提示复习指针时建议自己画内存布局图。把变量、指针、指针的指针之间的关系画清楚很多看似复杂的题目一眼就能看穿。2.2 关键字与编译细节一不留神就踩坑C语言的关键字考察在2018这份卷子里主要集中在static、const、volatile、extern这几个上面。static修饰局部变量、全局变量和函数时含义不同笔试非常喜欢混在一起考。比如“static局部变量的生命周期是全局的但作用域是局部的”——这句话虽然简单但换到实际代码里你能不能判断变量在哪一步初始化、函数返回后值是否保留才是真正的考点。const的考察点比较杂常见的有const int *p和int *const p的区别const变量能不能被修改const在函数形参中的作用。这里面容易混淆的是指针常量和常量指针我的记忆方法是“从右往左读”遇到const int *p就先看*p是const——指向的对象不能变遇到int *const p就看p是const——指针本身不能变。volatile虽然出现频率不高但只要出现就一定是个坑。它的作用是告诉编译器不要对这个变量的访问做优化每次都从内存读取。网易喜欢考的场景是多线程共享标志变量或者嵌入式里读取硬件寄存器。如果你没写volatile编译器可能把变量优化到寄存器里导致读到的值一直不变。extern则主要和头文件、多文件编译结合考察问法通常是“如何在头文件中声明全局变量”或者“多个源文件如何共享同一个变量”。编译链接相关的题也比较多常见的有“头文件里能不能定义变量”“#include和#include的区别”“宏定义和函数的区别”。宏这块要特别注意带参数的宏比如#define SQUARE(x) x*x写SQUARE(ab)就变成了ab*ab结果完全不对。考场上一定要记得给宏参数加括号。2.3 字符串与库函数细节决定成败字符串处理是C开发工程师日常写得最多的代码之一笔试自然也爱考。网易2018年这卷子里字符串相关的题目主要集中在strlen和sizeof的区分、strcpy/strcmp/strcat的用法与边界问题、字符串逆序、查找子串、去除空格等等。strcpy这个函数有个经典陷阱它不检查目标缓冲区的大小如果源字符串比目标缓冲区长就会造成缓冲区溢出。笔试可能会让你指出这段代码有什么问题或者让你用更安全的方式改写。现在工程实践强烈不建议用strcpy应该用strncpy或snprintf。同理strcat也有缓冲区溢出风险用的时候必须保证目标空间足够。字符串逆序是热搜词里也出现过的题目笔试编程题里风格很接近。最简单的思路是双指针一个指向头一个指向尾交换字符头指针右移尾指针左移直到两者相遇或头超过尾。这个题目虽然简单但网易可能会加一些限制比如“原地逆序”“不能使用额外空间”“单词级别逆序而不是字母级别逆序”。我当时就遇到过“反转字符串中的单词顺序”的变种题需要先反转整个字符串再逐个单词反转回来这个“两次反转”的思路值得反复练习。3. 数据结构与算法编程题实战思路3.1 链表操作手写代码的高频题链表在笔试编程题中的地位极高网易几乎年年都考。2018年这份试卷的编程题里就有一道链表反转的题目考察的是指针操作的熟练程度。链表的题目难不难完全取决于你有没有形成肌肉记忆。我建议把下面这些链表操作都手写一遍反转单链表、合并两个有序链表、检测链表是否有环、找链表中点、删除倒数第N个节点、链表排序。以反转单链表为例迭代法的核心是三个指针前驱节点、当前节点、后继节点。每次把当前节点的next指向前驱然后整体后移。我见过不少考生在考场上把指针顺序搞乱写着写着就断链了。这里有个经验动手写之前先画一张链表图把每个节点的地址和指针方向标清楚再按照图去写代码正确率会高很多。链表问题还有一个共通的易错点处理链表头节点的变化。很多操作都会改变头指针比如反转、删除头节点如果不使用“虚拟头节点”dummy head技巧就需要单独判断头节点是否变化非常容易漏掉。我在笔试时一般直接用dummy head能省掉一半的边界判断。3.2 二叉树与递归遍历是基础中的基础二叉树在网易的笔试卷里通常以选择题和中等难度的编程题出现。遍历是最基础的包括前序、中序、后序和层序遍历。递归写法几乎人人都能写出来但笔试可能考的是非递归写法尤其是非递归的中序和后序遍历用栈模拟递归过程。我当年准备笔试时把这三个非递归遍历都练到了闭着眼睛能写出来的程度事实证明非常有用面试时也经常用到。除了遍历本身树的递归性质还衍生出一堆常见题求二叉树的最大深度、最小深度、判断两棵树是否相同、判断是否为平衡二叉树、求路径和等等。这些题都可以套用递归模板先处理根节点再递归处理左子树和右子树最后返回合并结果。写递归时最容易出的问题是“递归终止条件”没写对或者漏写导致栈溢出。建议每次写递归函数时第一行先写边界条件再写逻辑。网易编程题里还出现过“二叉搜索树BST的中序遍历是升序序列”这个性质的变体题。比如“验证一棵树是否为BST”或者“找BST中第K小的节点”。很多人的第一反应是中序遍历存到数组里再判断或取值。这种解法没有问题但面试官可能会追问“能不能不用额外空间”那就需要用到Morris遍历或者在递归时记录前驱节点。3.3 排序、查找与动态规划经典算法压轴排序算法这部分笔试很少会让你完整写快速排序但一定会考“排序算法的稳定性”“最坏时间复杂度”“数据有序时哪个算法更快”这类选择题。快速排序、归并排序、堆排序这三者必须能说清楚原理和适用场景。举个例子如果题目要求“对链表进行排序”最优解通常是归并排序因为链表不支持随机访问快速排序在链表的场景下不但慢而且实现复杂。查找算法里二分查找是绝对的重头戏。网易喜欢把它和数组结合起来考比如“在旋转有序数组中查找目标值”“在有序数组中找到第一个大于等于某个数的位置”。这些题目看起来是二分但边界条件极其容易被搞错。我的经验是写二分查找时明确规定left和right是闭区间还是左闭右开然后全程保持一致。一旦思想上摇摆写出来的代码必有Bug。动态规划在2018年这份试卷里属于拔高题通常出现在第二道编程题。常见题型是“最长公共子序列”“最长递增子序列”“斐波那契类问题”“背包问题”等。dp部分我个人的建议是不要死记硬背状态转移方程而是理解“状态表示”是怎么定义的。比如最长递增子序列dp[i]表示以第i个元素结尾的LIS长度那么dp[i]一定可以由前面所有小于nums[i]的dp[j]1中取最大值得到。状态定义清楚了转移方程自然而然地写出来。笔试时如果时间紧张也可以先写暴力递归加上剪枝至少能拿到部分分数。4. 操作系统与网络考点解析4.1 进程与线程从概念到并发实战操作系统在网易C开发岗笔试中出现频率不低尤其是进程与线程部分。选择题常考“进程和线程的区别”“哪些是进程独有的哪些是线程共享的”比如进程有独立的地址空间线程共享进程的地址空间、文件描述符表、信号处理器等但每个线程有自己的栈和寄存器上下文。这个知识点虽然基础但考得很细我建议画一张对比表来记忆。死锁是另一大考点。死锁四个必要条件互斥、持有并等待、不可剥夺、循环等待必须背下来并且能够判断一段代码里锁的顺序是否会引发死锁。网易2018年的题目有一道是“两个线程各自持有A锁又要去获取B锁”这正是典型的“锁顺序不一致导致死锁”案例。另外一个容易考到的是银行家算法的概念至少要知道它是个“避免死锁”的算法而不是“预防死锁”或“解除死锁”。多线程编程实战题通常结合C的pthread或者C11的std::thread来考。题目会给一段模拟并发计数的代码问最后的结果对不对、会不会出现数据竞争、应该怎么加锁。这里有一个必考细节变量加锁要加在写操作上读操作同样需要加锁或使用原子变量否则读操作可能读到旧值或者不一致的值。别看这个点简单考场上被绕进去的人真不少。4.2 内存管理虚拟内存、堆和栈内存管理这块的考点主要分为两个层面一是“进程虚拟内存空间布局”二是“堆与栈的区别”。虚拟内存布局里从高地址到低地址依次是栈、堆、BSS段、数据段、代码段。笔试可能会给你几个地址让你判断它们分别属于哪个段或者问“局部变量在哪个段”“malloc分配的内存在哪个段”“未初始化的全局变量在哪个段”。这类题属于死记硬背就能拿分但一定要仔细。堆和栈的区别是很多同学记不全的考点。栈由编译器自动分配和释放空间相对较小通常在MB级别分配速度很快堆由程序员手动申请、释放空间大可到GB级别但分配速度较慢容易产生内存碎片。从实践角度来看如果需要大块内存或者内存在函数返回后仍然需要存在就必须用堆栈上分配的对象函数一返回就自动析构了这个生命周期的问题笔试和面试都特别爱考。4.3 网络基础TCP协议是重头戏网络题占比不算特别高但几乎每年都会考几道。TCP三次握手和四次挥手是必考项。选择题可能问你“TCP连接建立需要几次握手”“第二次握手失败会怎样”“TIME_WAIT状态出现在哪一端、为什么需要等2MSL”。这些问题回答的关键在于理解TCP的状态机而不是死记状态名。我再强调一次TIME_WAIT因为网易特别爱考主动关闭连接的一方在发送最后一个ACK后会进入TIME_WAIT状态持续2MSL时间。这样做的目的有两个一是为了保证最后一个ACK能够到达对端如果丢了还能重发二是为了让旧连接中的所有报文在网络中消失避免干扰新连接。如果你在答这道题时能说出“主动关闭方”这几个字就已经超过一半的人了。另外TCP和UDP的区别这类基础题也会出现TCP面向连接、可靠传输、有流量控制和拥塞控制UDP无连接、不可靠、只提供“尽力而为”的服务。HTTP部分则主要考察“HTTP/1.0和HTTP/1.1的区别”“Keep-Alive的作用”“GET和POST的区别”等常识。总的来说网络部分不需要复习得多深把TCP/UDP的核心机制和HTTP基本常识掌握好就足够应对校招笔试了。5. 笔试题实操演练与答题技巧5.1 选择填空题如何在不确定时提高正确率笔试中选择题占比不小很多是“选出错误的一项”或“以下代码输出什么”。这类题在考场上特别容易慌因为选项之间差异极细微。我的策略是先把题目完整的C代码抄到草稿纸上笔试可以是纸质试卷在线笔试则用本地编译器跑然后手动“人肉执行”每一条语句不要凭感觉猜。尤其遇到指针运算和内存相关的题画地址和值的对应关系图是最高效的。如果遇到完全不会的题也不要乱蒙。先排除掉明显不可能的选项再基于C语言的标准行为去判断。比如一个空指针被解引用程序行为是“未定义”选项里如果出现“输出0”或“什么都不发生”这类确定性描述通常都是干扰项。记住C语言的标准里写了“未定义行为”的代码任何结果都有可能出题人不会把“未定义”选项放在那里让你选的。5.2 代码阅读与改错题锻炼“代码走读”能力代码阅读题网易的出题风格是给你一段30-50行的小程序涉及指针、字符串、结构体和内存操作要求你写出输出结果或者指出错误。做这类题我的方法是“三步走”第一步把程序中每个变量的类型和初始值列出来第二步逐行执行遇到函数调用就新开一帧记录参数传递和返回值第三步特别注意循环终止条件和指针移动范围。改错题比阅读题更考验工程经验。常见的错误类型有数组越界、字符串没有\0结尾、malloc后没有判空、内存泄漏、函数形参应该用指针却传了值、释放了栈上地址、逻辑运算符写成了赋值。这里面“写成”这个错误虽然低级但确实出现在真实笔试中因为C语言中if (a 1)的赋值结果恒为真编译器不一定警告程序行为和预期完全不一样。建议大家做题时把所有这类“一眼假”的代码都检查一遍不要理所当然地认为它没问题。5.3 手写编程题从审题到提交的完整流程编程题是笔试的大头网易2018年这份卷子里有两道建议分配至少40分钟。第一题通常是中等难度的数据结构题第二题是动态规划或贪心。我的答题顺序是先花两三分钟读题确认输入、输出格式、数据范围然后直接写核心算法不急着先写头文件和main函数。写完核心函数后再补全输入输出解析这样可以避免把时间浪费在无关代码上。以“字符串逆序输出”这类题为例虽然简单但要注意几个隐含要求是否允许修改原字符串、是否要考虑中文字符多字节编码、是否需要保留空格和标点位置。大多数笔试环境默认输入是单组测试数据输出末尾要换行。如果你在在线评测系统里因为“格式错误”被判错多半就是缺少换行或者多了空格。编程题还有一个容易丢分的地方没有处理空输入或异常情况。比如链表题目如果传入的是空链表数组题目如果N为0。在代码开头加上if (输入为空) return 空结果;这样的判断能显著提高通过的测试用例数量。考场上宁可多见缝插针地加判空也不要心存侥幸认为测试用例一定合法。5.4 本地环境准备与编译调试笔试环境可能是在线网页版也可能要求本地编译后提交。如果你用的是Windows建议提前装好MinGW-w64或Visual Studio保证gcc命令能在终端里直接用。之前有同学折腾VS Code配置C/C环境配置花了两天笔试前一天还在编译报错心态直接崩了。我这里说一句VS Code配C/C环境的核心就是安装好编译器、配置好tasks.json和launch.json网上教程很多照着配置一遍然后用Hello World验证一下就行。在线笔试时一定要学会用printf调试法。很多人遇到代码结果不对先想半天其实最快的定位方式就是在关键节点打印中间值——变量在循环里的变化、递归入口的参数值、指针指向的地址。笔试没有限制你用printf跑一遍就能看到哪一步出了问题。拿不到Bug时不要死磕先确认有没有越界、有没有访问空指针、有没有初始化变量这三个问题能覆盖80%以上的运行错误。根据我个人经验真正让你在笔试卷上拉开差距的往往不是最后那道压轴DP题而是前面那些看似基础的选择题和改错题。基础题做得越稳编程题即使不完全AC你也能稳稳进入下一轮。建议大家平时刷题时多问自己一句“这题如果换个问法我还能做出来吗”把知识的迁移能力练出来笔试自然不慌。6. 常见问题与排查技巧实录6.1 笔试中常遇到的“隐形坑”清单我在刷这份试卷和辅导同学的过程中整理了一份高频易错点清单基本上覆盖了大多数考生的翻车点。第一sizeof(数组名)和sizeof(指针)的区分数组名在sizeof运算中表示整个数组一旦传入函数退化为指针sizeof就变成指针大小。第二结构体对齐和填充sizeof(struct)不一定等于各成员之和要按对齐规则补齐。第三int和unsigned int比较时int会隐式转换为unsigned int负数会变成特别大的正数。这三个坑在2018这份卷子的选择题里至少出现两个值得反复看。还有一类常见问题与“C盘空间”无关但和“开发环境”相关有同学在本地VS Code写好代码并运行成功但提交到在线评测系统却提示编译失败。这种情况多半是头文件路径、编译器标准或主函数返回值类型的问题。在线评测系统一般使用gcc -stdc99或c11编译所以代码里不要使用只在某个特定编译器上支持的扩展语法主函数写int main()最后return 0;。6.2 时间分配与心态管理的实战建议笔试时间一般两小时题目量在20-30道之间时间紧张是常态。我建议的分配比例是选择题和填空题控制在40分钟内代码阅读与改错题控制在30分钟内剩下50分钟留给两道编程题。编程题如果第一道10分钟内没有思路果断先看第二道不要在一棵树上吊死。做题顺序也可以适当调整先做自己擅长的板块建立信心后再去啃硬骨头。考场上心态崩了怎么办提前给自己设定“止损线”如果一道选择题卡了超过3分钟先标记下来跳过去做完一遍再回头。编程题如果完全想不出来最优解可以先写暴力解法至少拿到一部分样例分。网易的笔试评分通常按用例的通过比例给分暴力法通过30%的用例可能比完全空着强得多。6.3 复盘方法笔试结束后的成长关键笔试结束不代表学习的结束反而是一个很好的复盘节点。我建议不管笔试成绩如何都把题目回忆出来重新做一遍然后分类整理错误原因是知识点掌握不牢还是读题不仔细还是代码实现有Bug。整理成一份错题本每个知识点至少留三道练习题第二轮面试前只翻错题本效率会非常高。动手实践很重要我在实际准备过程中发现光看不练的问题在笔试现场暴露得尤其明显。所以从今天开始找一个安静的时间打开编辑器把链表反转、字符串逆序、二分查找、二叉树遍历这几道题手写一遍再想想有没有优化的空间。准备好了笔试就没什么可怕的了。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进