网易校招C++笔试复盘:从八股到算法的备考指南 📅 发布时间:2026/8/31 10:31:17 👁 浏览次数: 网易2023校招笔试-C开发工程师正式第二批这套卷子我完整走了一遍前后大概准备了三个月。说实话收到笔试通知之前我一直以为大厂笔试就是把LeetCode刷熟就够了真正开始系统准备才发现C方向要啃的东西比想象中多不少语言八股、内存模型、并发、网络、算法数据结构每一项都可能成为拉分点。这篇文章就是对这次笔试以及同类大厂C笔试的复盘重点梳理考什么、怎么准备、有哪些坑希望能给正在备战校招的同学一些实际参考。1. 网易2023校招笔试-C开发工程师正式第二批考了什么整体形态与备考定位1.1 笔试结构与题型分布网易这套C开发工程师的笔试整体结构和国内主流互联网公司差别不大主要由客观题和编程题构成。客观题里选择题占大头考察的知识点覆盖面很广从C语法细节、内存管理、STL底层原理到操作系统、网络协议、数据库基础都可能出现。编程题一般是2到3道按难度梯度排列前一道偏基础后面逐渐加大难度。我的感受是这套卷子并不追求偏题怪题反而非常看重基础功。比如C里智能指针的引用计数怎么维护、vector扩容的均摊复杂度是多少、map底层为什么选红黑树而不是AVL树这些老生常谈的八股点反复出现。操作系统部分的题目也比较常规进程和线程的区别、虚拟内存的作用、死锁产生的四个必要条件基本就是靠平时积累。另外编程题占的分值很高一旦编译不通过或逻辑有误基本就和下一轮说再见了。所以备考时不能只背八股手写代码的能力必须练到位。1.2 和其他大厂C笔试的差异我横向对比了腾讯、字节、美团这几家的C笔试题网易有自己的风格。腾讯的笔试更偏重算法题目量大时间紧张动态规划和大模拟题经常出现对代码速度要求极高。字节的题侧重思维灵活性经常给一个场景让你设计数据结构或者优化算法。美团则喜欢考工程向的题目会问一些“线上服务内存不断上涨怎么排查”这类实际问题。网易给我的感觉是“基础算法”并重。客观题里C语法的占比明显比字节高编程题的难度则略低于腾讯但更重视代码的健壮性和边界处理。它不会故意出一个需要高级数据结构的题更常见的是把基础算法和语言特性结合起来比如让你用链表实现某种功能、用字符串处理解决实际问题。备考时如果只刷Hard题未必占优势反而把Medium题和基础八股吃透更划算。1.3 时间分配与做题策略这套笔试的总时长通常是两小时左右客观题和编程题之间的时间分配很关键。我第一次模拟的时候在客观题上花了太多时间导致最后一题差点没写完后来调整了策略先快速扫一遍整套卷子优先做有把握的选择题遇到拿不准的直接标记跳过绝不恋战。编程题先读题估算复杂度如果第一题比较基础就立刻写完提交确保拿到保底分。我的建议是客观题控制在30到40分钟每题最多2分钟超过就直接猜一个并标记后面有时间再回看。编程题从易到难做每道题先花5分钟想清楚思路和边界条件再动手写。如果真的卡住了也别死磕先把能过样例的暴力解法写上拿到部分分比空着强得多。2. C语言基础考点的精细化复盘从八股到工程细节2.1 内存与指针智能指针、内存泄漏、字节对齐C的笔试选择题里内存相关的内容几乎必考。智能指针是重灾区auto_ptr为什么被废弃、unique_ptr为什么不能拷贝、shared_ptr的引用计数是线程安全的吗、weak_ptr怎么解决循环引用这些都是高频考点。一个容易答错的点是shared_ptr的引用计数本身是线程安全的但它管理的对象不是。换句话说多个线程同时通过shared_ptr读同一个对象没问题但如果一个线程写、一个线程读仍然要自己加锁。这个细节笔试里经常以“以下说法正确的是”的形式出现。另一个常考点是new/delete和malloc/free的区别。new不仅分配内存还会调用构造函数delete会调用析构函数再释放内存。而malloc/free只处理内存。还有一点经常被忽略new[]对应delete[]new对应delete混用会导致未定义行为。笔试里有个经典问法是“delete[]和delete有什么区别”本质就是在考数组对象析构函数的调用次数。字节对齐也是选择题偏爱的题目类型。结构体的sizeof计算要考虑对齐规则默认对齐值通常是成员中最大对齐数的整数倍同时满足每个成员自身对齐。这里有一个实操技巧把结构体成员按从大到小排列可以减少填充字节节省内存。笔试如果只是让你算sizeof记住“最大成员对齐 总大小是最大对齐数的整数倍”这个口诀基本够用。2.2 字符串与容器初始化、底层实现、扩容机制字符串这块笔试常考的就是字符串数组初始化。比如char str1[] hello和char str2[] {h,e,l,l,o}的区别前者会在末尾自动补一个\0所以sizeof结果是6后者sizeof是5打印的时候行为可能不同。很多同学在选择题里栽在这上面。std::string的底层实现也是一个高频八股点。现代标准库中常见的有两种策略一种是COW写时复制另一种是SSO小字符串优化。SSO的思路是当字符串长度小于某个阈值一般是15或22字节时直接存储在对象内部的固定数组中不分配堆内存超过阈值才走动态分配。笔试如果问“string的拷贝为什么可能很快”大概率就是在考察SSO或COW的概念。vector的机制更是必考扩容是1.5倍还是2倍均摊复杂度为什么是O(1)reserve和resize的区别size()和capacity()的区别。我建议把vector的底层扩容过程完整推演一遍当size等于capacity时重新申请一块新内存把旧元素搬过去释放旧内存。理解了为什么搬移构造比拷贝构造高效才能在选择题里迅速判断“哪些操作可能失效迭代器”。map这类关联容器的底层实现也要清楚。map基于红黑树插入删除查找都是O(log n)而unordered_map基于哈希表平均O(1)。笔试喜欢问“为什么map用红黑树不用AVL树”核心原因是红黑树的旋转次数更少插入删除的整体性能更好。2.3 C11/14/17核心特性constexpr、右值引用、lambdaconstexpr是C11引入的关键字这一点常有同学记混。C11里constexpr只能用于简单的常量表达式函数C14放宽了限制允许在constexpr函数中使用局部变量、循环和分支C17进一步支持了if constexpr可以在编译期做条件分支C20还加入了consteval和constinit。笔试问“constexpr是哪个C版本引入的”答案是C11但如果你能顺带说出后续版本的演进选择题里遇到“以下说法正确的”就能多一层判断依据。右值引用和移动语义是C11的另一个大热点。笔试常考std::move的本质是什么它其实只是一个static_cast把左值转成右值引用本身不搬移任何数据。真正搬移数据的是移动构造函数和移动赋值运算符。一个常见的坑是移动构造之后原对象处于“有效但未指定”的状态不能再假设它保留旧值但可以安全析构和重新赋值。lambda表达式在笔试中更多出现在代码题里问捕获列表的区别[]按值捕获所有变量[]按引用捕获所有变量。这里有个隐蔽的坑按值捕获的变量在lambda定义时就已经拷贝而按引用捕获的变量在lambda调用时才读取。如果在循环里创建lambda并保存捕获方式选错了结果会非常诡异。笔试的改错题偶尔会拿这个做文章。2.4 回调函数与设计模式回调函数是C笔试中概念性和实操性结合很强的一个点。回调的本质是把一段可调用对象作为参数传给另一个函数由后者在合适的时机调用。C里实现回调的方式有函数指针、std::function、lambda、函数对象。笔试常见问法是“回调函数和普通函数的区别”“std::function和函数指针的区别”。一个简化的回调例子是这样#include iostream #include functional void process(int x, std::functionint(int) callback) { int result callback(x); std::cout result: result std::endl; } int main() { auto square [](int a) { return a * a; }; process(5, square); // 输出 result: 25 return 0; }这段代码里process负责执行流程具体的计算逻辑通过回调传入调用方和实现方解耦。这是笔试特别喜欢考的设计思想。设计模式方面网易笔试的客观题偶尔会出现“单例模式在多线程环境下怎么保证安全”“观察者模式适用于什么场景”“工厂模式和抽象工厂模式的区别”这类问题。单例的双重检查锁是一个经典考点DCLP在C11之前存在内存可见性问题C11之后可以用std::call_once或者局部静态变量Magic Static来保证线程安全的初始化。3. 操作系统、网络与并发笔试中占比很高的“八股”区域3.1 进程与线程区别、协程、线程池C开发岗位的笔试操作系统是躲不开的。选择题大部分会集中在进程和线程的区别上进程是资源分配的最小单位线程是CPU调度的最小单位同一进程内的线程共享地址空间进程之间相互隔离线程切换的开销比进程切换小因为线程不需要切换页表。协程也是这两年的热门考点。协程的本质是用户态的、可挂起和恢复的函数切换由用户程序自己控制不涉及内核态切换因此成本比线程更低。C20正式引入了协程关键字co_await、co_yield、co_return笔试如果问“协程和线程的区别”核心是说清楚协程是协作式调度、线程是抢占式调度。线程池的概念也常被考察。笔试更多是以代码题或问答题形式出现实现一个简单的线程池或者问“线程池的核心参数有哪些”。核心参数无非是核心线程数、最大线程数、任务队列容量、拒绝策略。理解了这些后面面试聊高并发场景也能用上。3.2 多线程同步互斥锁、条件变量、死锁、ABA问题并发相关的客观题里死锁的四个必要条件几乎是必考互斥、占有并等待、不可剥夺、循环等待。解决思路也是送分项破坏其中之一即可。但笔试喜欢换着花样考比如给一段加锁代码问是否可能死锁这时候要能识别出两个线程以不同顺序持有两把锁的场景。条件变量的使用也是C多线程编程的基础知识点。一个标准的生产者消费者模型里wait操作一定要和谓词条件配合使用防止虚假唤醒std::unique_lockstd::mutex lock(mtx); cv.wait(lock, [] { return queue.size() capacity; });这里必须传lambda作为第二个参数否则wait返回后队列不一定满足条件。这个写法和直接worker.wait(lock)的区别笔试选择题经常考。ABA问题是无锁并发中一个经典概念。简单说就是CAS操作时值从A变成B再变回ACAS会认为值没变过从而成功执行但中间其实有其他线程改过数据。解决办法是引入版本号或使用带标签的原子引用。网易笔试里出现过ABA问题的选择题问“以下哪种方式可以避免ABA”看到“版本号”基本就是正确答案。3.3 网络与I/OTCP握手、epoll、select/poll/epoll对比网络协议部分TCP三次握手和四次挥手是永恒考题。笔试喜欢问“为什么握手是三次不是两次”“为什么挥手是四次而不是三次”。三次握手是为了确保双方的发送和接收能力都正常更重要的是要初始化序列号防止历史连接重复到达。如果只有两次握手服务端无法确认客户端的接收能力。I/O多路复用也是C后端岗的高频考点。select、poll、epoll的对比要能写成表格从支持的文件描述符数量、底层数据结构、通知机制、性能表现几个维度展开。epoll是事件驱动的只通知有事件发生的fd不需要每次都把整个fd集合从用户态拷贝到内核态所以高并发场景性能更好。笔试如果问“epoll为什么比select快”就要从这三个角度答拷贝量、遍历量、回调机制。这里我补充一个和笔试平台相关的细节有些线上评测系统的题目会直接给一个网络编程相关的选择题比如“当连接被对方关闭后read返回什么”答案是0。遇到这种题目多想想最底层的行为别被复杂概念绕晕。3.4 虚拟内存与缺页中断虚拟内存是操作系统的核心概念。笔试常规考点是页面置换算法FIFO、LRU、OPT问缺页次数。LRU算法实现也常作为手写题出现可以用哈希表加双向链表实现复杂度O(1)。这和C里list与unordered_map的组合正好对应笔试考这个题的好处是一道题同时考察了数据结构和操作系统知识。还有一类题是问“发生缺页中断后操作系统干什么”从磁盘把页面换入内存更新页表项如果内存满了还要触发页面置换。这个流程清楚了后面排查线上内存问题也能更快定位方向。4. 算法与数据结构题的实战拆解笔试中最容易拉分的部分4.1 常考高频算法排序、快速幂、单调栈、DP算法题是笔试的分水岭。C岗位的笔试题高频考点集中在排序算法的时间复杂度和稳定性、快速幂、二分查找、单调栈、动态规划、图论基础。排序这块笔试选择题喜欢考冒泡排序和选择排序的比较。冒泡排序每一轮把最大元素“浮”到末尾相邻两两比较交换次数多最好情况是O(n)选择排序每一轮找到最小元素和当前位置交换交换次数少但无论什么情况都是O(n²)。快速排序的平均复杂度是O(n log n)但最坏会退化到O(n²)。C里std::sort是内省排序结合了快排、堆排和插入排序就是为了避免最坏退化。快速幂是笔试中出现率极高的一题因为代码短但考察了位运算和分治思想。原理很好理解计算a的b次方时把b拆成二进制比如b13对应1101只需要计算a¹、a²、a⁴、a⁸再选择性相乘。迭代写法如下long long fastPow(long long a, long long b, long long mod) { long long res 1 % mod; while (b) { if (b 1) res res * a % mod; a a * a % mod; b 1; } return res; }这段代码笔试里经常要手写注意模运算和初始值1 % mod的边界当mod为1时不能直接返回1否则会出错。单调栈也是高频题。核心套路是维护一个栈内元素单调递增或递减的栈用来解决“找下一个更大元素”一类问题。经典例题是柱状图中最大矩形面积遍历每个柱子栈里存下标遇到比栈顶矮的柱子就弹出同时计算面积。理解了单调栈的入栈弹栈时机这类题基本能秒。动态规划相对难一些。笔试常考的DP包括背包问题、最长公共子序列、最长递增子序列、编辑距离。备考时可以先把这些经典的递推公式背熟再通过题目训练状态定义能力。4.2 笔试编程题的特殊要求IO处理、边界条件、复杂度编程题和LeetCode最大的区别在于笔试需要自己处理输入输出。很多同学LeetCode刷得好笔试却栽在IO上。C里处理输入时如果数据量很大cin不开加速会超时。建议比赛和笔试时都加上这一句ios::sync_with_stdio(false); cin.tie(nullptr);这两行的作用是关闭C和C输入输出流的同步以及解除cin和cout的绑定能显著提高读写速度。读入整行数据也有讲究。如果用cin s遇到空格就停了需要读一整行时应该用getline(cin, s)。但要注意如果前面使用了cin 读取整数换行符还在缓冲区里直接getline会读到空行需要先处理掉残留的换行。字符串转数组也是笔试高频场景。比如读入一行数字1 2 3 4 5要转成vector 。简洁写法是#include iostream #include sstream #include vector #include string std::vectorint parseLine(const std::string line) { std::istringstream iss(line); std::vectorint res; int x; while (iss x) res.push_back(x); return res; }这类工具函数最好提前准备好模板考试时直接复用能省下不少时间。边界条件更是笔试的隐形杀手。数组越界、n为0、字符串为空、整数溢出都是常见的“看起来代码没问题但就是不过”的原因。做题时先问自己三个问题输入最小范围是什么最大范围是多少计算过程会不会溢出比如求n个整数的最小公倍数直接累乘再除最大公约数如果数字很大先乘后除可能会溢出正确做法是先除再乘或者用long long必要时用跳跃式的LCM更新公式。另外还要注意“指定顺序输出”这类题题目要求的输出格式空格、换行要和样例完全一致多输出一个空格也可能被判格式错误。4.3 经典题目延伸消息传递、物流网络、最小公倍数笔试里偶尔会出现看起来“名字很熟”的经典题。比如热词里提到的“消息传递”和“物流网络”这类题目通常不是新题而是NOIP或GESP难度题目改造来的。消息传递这类题常见模型是在有向图里求一个点能影响的最大节点数或者求环的大小。解法可能用到Tarjan强连通分量、缩点、拓扑排序甚至树上DP。如果笔试出现“消息传递”相关题第一步应该是尝试抽象成图模型再看是求最短路、求连通性还是求最大传播范围。物流网络题多数是最短路或最小生成树的变体。如果是“多个仓库到多个城市配送成本最低”这种问法大概率是最小费用最大流或者直接建图跑Dijkstra。GESP七级对应难度通常不会考太复杂的模板单源最短路加堆优化已经够用。备考时把Dijkstra、SPFA、Floyd的适用条件和代码模板背熟遇到图论题至少能拿一半分。最小公倍数这类题看似简单但很爱在“多个数”和“溢出”上设坑。多个数的LCM可以通过两两合并逐步求long long lcm(long long a, long long b) { return a / std::gcd(a, b) * b; }注意先除后乘先乘后除容易溢出。笔试选择题可能直接问“n个整数的最小公倍数怎么求”这个表达式就是答案。5. 工具链与环境配置的门槛vscode、编译器、运行时的坑5.1 vscode配置C/C环境的关键点笔试虽然是线上评测但备考阶段总要在本地写好代码再调试。vscode配置C/C环境是很多同学第一道坎常见问题集中在三处编译器没装、tasks.json和launch.json配置不对、includePath找不到头文件。编译器是根基。Windows下可以选择MinGW-w64或者MSVCLinux下直接用g。装了编译器之后最关键的是确认它在系统PATH里否则vscode的终端找不到g命令。配置完成后先在终端里跑一句g --version能正常输出版本号环境才算通。tasks.json和launch.json的坑更多。tasks负责编译launch负责调试两者需要配合。一个常见的错误是只写了tasks.json没写launch.json导致F5调试时说找不到调试程序。另一个坑是launch里的preLaunchTask名字必须和tasks里的label完全一致大小写一错就报错。C/C扩展还要求正确设置compilerPath否则语法分析和实际编译可能不一致出现“编辑器不报错但编译报错”的诡异情况。关于头文件的includePathvscode的C/C扩展依赖这个配置来解析标准库头文件。通常自动检测就能工作但如果你手动改了默认的编译标准比如用了C17标准就需要在c_cpp_properties.json里把cppStandard设为cpp17否则扩展会按C11解析部分新语法会被标红。5.2 Visual C Redistributable缺少运行时的报错Visual C Redistributable是Windows下C程序运行的依赖项很多同学在本地跑别人给的C项目时遇到过“找不到MSVCP140.dll”或者“VCRUNTIME140.dll缺失”的报错就是缺了它。笔试虽然不需要本地装运行库但理解这个东西能帮你更好地理解C程序的运行机制。MSVC编译出来的程序默认动态链接到VC运行时运行时包含C标准库的实现和支持函数。发布程序时不仅要带exe还要保证目标机器有对应版本的Redistributable。在开发环境中装了Visual Studio Build Tools之后会自动带上这些运行库但如果只装了编译器或者MinGW可能会遇到不匹配的情况。一个更隐蔽的问题是架构不匹配x86的程序需要x86的Redistributablex64的程序需要x64的Redistributable装错版本一样会报错。这个和编译目标平台的设置直接相关如果遇到程序在别人的电脑上能跑在自己电脑上报错先从架构和运行时版本查起。5.3 笔试平台的环境差异本地通过、线上编译报错备考阶段最容易遇到的情况是本地用vscode调通了代码线上评测系统编译不通过。原因很可能是编译器版本和C标准不同。本地用的是较新的g默认支持C17甚至C20线上平台如果只支持C14很多语法就会直接编译失败。比如C17的if constexpr、结构化绑定C20的concept和range在旧标准下都是非法代码。所以备考写题时尽量养成“按C14/17写”的习惯避免用太新的语法特性。可以用编译器参数-stdc14做本地验证确保代码兼容性。另一个差异点是头文件和函数名。有些平台会禁用某些函数比如gets早已废弃但笔试平台上如果编译不通过优先检查是不是使用了平台不允许的库。还有一点是大小写和提交语言的选项C提交时选错语言版本也可能导致编译报错这个纯属仔细程度问题。调试方面vscode配置好调试器之后可以本地逐步调试。但笔试线上评测不会给你调试机会所以平时写完代码要学会自己“人肉调试”在关键分支打印中间变量确认边界值执行对了再提交。5.4 本地构建与动态库注意点热词里还出现了“vscode c编译so导出库”这是Linux下C开发的一个实用场景。C不像Java那样能跨平台一句javac搞定编译动态库时需要注意导出符号。在Linux上很多初学者用g编译so文件后发现链接时找不到符号原因往往是忘了加-fPIC和-shared选项g -stdc17 -fPIC -shared -o libmylib.so mylib.cpp-fPIC表示生成位置无关代码编译动态库必须加否则链接时会报“relocation R_X86_64_32S against symbol”类似的错误。笔试虽然不直接考这个但很多C简历项目的代码都涉及模块化开发理解动态库的编译流程对理解程序从源码到可执行文件的完整过程有帮助这类编译原理相关的选择题偶尔也会出现在笔试里。6. 备考节奏与实操建议从笔试到面试的过渡6.1 三个月备考节奏建议我个人的备考周期是三个月第一阶段打基础第二阶段刷题第三阶段模拟实战。第一个月集中看C基础八股和操作系统网络基础知识。每天固定拿出两小时看八股文档整理出一份自己的知识点清单。这个阶段不需要大量刷题重点是建立知识框架把malloc和new、map和unordered_map、进程和线程这些基础概念彻底吃透。第二个月进入专项刷题阶段。每天至少两道算法题覆盖排序、二分、动态规划、图论、字符串处理等高频考点。刷题时不要只看AC率每道题都要复盘考察了什么数据结构和算法有没有更优解边界条件是什么。同时开始背笔试高频八股比如智能指针、单例模式、epoll原理做到能不看文档默写。第三个月进入模拟实战。定时两小时完成一套模拟卷练习时间分配和心态管理。模拟卷可以找往年的笔试真题也可以刷LeetCode的Hot 100。关键是模拟考试环境只允许自己看一个文档编辑器不暂停不查资料和真实的笔试一样。6.2 手写代码的训练方法笔试编程题和日常开发的写法不一样。日常写代码有IDE提示、有自动补全、有快捷键笔试只有裸编辑器很多代码得一个字一个字敲。所以备考阶段一定要训练“裸写代码”的能力。我的方法是用普通记事本写代码写完再复制到编译器里跑看哪里报错。这样能倒逼自己记住常用库的名字、函数签名和代码框架。比如#include vector、std::sort、std::string的常用接口这些平时IDE自动补全的东西笔试时候都要靠脑子。另一个训练方法是练习“一题多写”。同一个最小公倍数问题先用循环写再用递归写再考虑大数溢出怎么处理。这样刷一道题能覆盖多个知识点比盲目刷十道题效果更好。笔试考场上遇到变体题思路也会更开阔。手写代码时还要格外注意代码规范。很多笔试平台不会因为缩进扣分但清晰的变量命名和注释能帮你自己快速定位逻辑问题。别为了省时间用a、b、c命名不如多输入几个字符用index、count、result调试时省心得多。6.3 笔试之外的隐藏加分项笔试和面试其实是联动的。笔试成绩好不代表面试一定稳但笔试暴露出来的薄弱点面试官很可能会顺着追问。所以笔试后复盘比笔试本身更重要。每次模拟笔试或者真实笔试后我都会做一个错题分类表把错题按“语法细节、容器底层、多线程、算法、网络、操作系统”分类标出错误原因。后面的复习就是反复看这个表尤其是那些“看起来会但做错了”的题比完全不会的题更有价值因为它们说明你的知识有盲区。在备考阶段多写一些小项目比如用C实现一个线程池、写一个控制台小工具、做点“c爱心代码”“c好玩的代码”这类趣味练习既能保持代码手感又能加深对语言特性的理解。这些代码虽然不会直接出现在笔试题里但写多了之后你对指针、引用、容器、回调这些概念的操作会形成肌肉记忆做选择题时判断更快更准。6.4 笔试结束后的复盘思路笔试结束之后趁着记忆还清晰尽快把题目和考点记录下来。尤其是编程题回忆当时的解题思路、代码哪里卡住了、有没有考虑边界条件全写进错题本。即使没有全部通过这个复盘过程也能帮你确定后续的复习方向。模拟笔试的成绩不一定等于真实笔试的成绩心态影响很大。我第一次做全真模拟卷编程题第一题编译不过后面心态崩了两小时只做完了一题。后来我养成一个习惯不管发生什么先深呼吸告诉自己“这一题不会下一题可能简单”先把会做的拿到分再说。关于刷题平台笔试前两周可以在在线OJ上多适应一下把输入输出处理练熟。重点练习的题型包括快速幂、冒泡排序和选择排序的手写、单调栈找下一个更大元素、字符串拆分转整数数组、多行输入处理、图的最短路模板。这些题目热词里都有对应说明是大家普遍关注的重点也是这个岗位笔试的高频方向。最后说一点个人体会网易这套C笔试真正有区分度的题目其实不是最难的算法题而是那些“看起来简单但容易粗心”的题。笔试拼的不仅是知识量更是稳定性和细心程度。我见过有同学把所有八股背得滚瓜烂熟但编程题因为没处理输入空行而卡了一个小时。平时写代码多注意边界、多注意输入输出细节考试时真的能多拿不少分。