
这几年陆续有学弟学妹找我聊校招笔试的事说到完美世界2017校招技术综合B卷好几个人都把它当成“游戏公司笔试到底考什么”的经典样本来研究。我自己当年也做过这份卷子后来带项目时也帮着出过类似的笔试题回头看这份卷子它其实很能代表游戏公司技术校招的考察逻辑不追求偏题怪题而是在基础功、工程意识和临场思维之间找平衡。这篇文章我就结合这份B卷把里面的考点、出题意图、答题策略和踩坑点一次说清楚给准备进游戏行业做技术的同学一个参考。先说结论这份卷子整体难度不算高但覆盖面广区分度主要不在“会不会”而在“熟不熟”。它不指望你把每个知识点都答出花来但要求你在有限时间内稳定输出该拿的分一分不丢。题型上大致是选择题、简答题、编程题和设计题四类内容集中在C/C、数据结构与算法、操作系统、计算机网络、数据库以及少量游戏开发相关场景题。下面我按模块拆开讲。1. 整卷拆解出题人在用B卷筛选什么人1.1 游戏公司技术校招的考察基调先聊一个很多同学没想明白的问题完美世界这类游戏公司笔试到底想筛什么样的人答案不是“算法竞赛选手”也不是“背八股文高手”而是基础扎实、能动手、能扛事的人。游戏开发是工程性很强的领域客户端要跟渲染、内存、UI、编辑器打交道服务端要处理高并发、数据一致性、网络同步任何一个环节出问题都会直接影响玩家体验。所以笔试题目往往围绕“你大学四年有没有真正理解计算机核心知识”来出B卷正是这个思路的典型体现。这份B卷没有出现特别偏门的题目也没有刻意刁难人的脑筋急转弯。大部分题目我做完之后的感受是每道题都见过但想拿满分需要平时积累够深。比如它考内存分配、考TCP状态、考SQL索引这些知识点在课堂上都讲过但能不能在半小时内准确完整地写出来就是另一回事了。这也是B卷最大的价值它不是用来“刷掉”谁的而是用来“看清楚”谁更适合做游戏开发。1.2 题型分布与分值设计从题型结构看B卷大致是这样的布局题型题量考察重点分值占比约选择题20道左右基础知识覆盖面30%简答题4-5道概念理解与表述能力20%编程题2-3道代码实现能力30%设计/场景题1-2道工程思维与系统设计20%这个比例透露了两个信息。第一基础知识占了半壁江山选择题和简答题基本决定了你的下限把基础题做好分数就不会难看。第二编程题和设计题决定了上限也是面试官后续重点追问的地方。我见过不少同学基础题答得不错但编程题思路混乱、代码漏洞百出结果连面试机会都没拿到。所以复习时不要只背概念一定要动手写代码这一点后面我会展开讲。2. 数据结构与算法分值最大、最需要稳定输出的板块2.1 链表与树的常见变体题B卷里数据结构相关题目主要围绕链表、二叉树、字符串和排序查找展开难度在LeetCode中等偏下但有一个特点喜欢考变体而不是让你直接“反转链表”“求二叉树深度”这种模板题。举个例子链表的题目很可能不是单纯的反转而是“每K个节点一组反转”或者“判断链表是否有环并找出环的入口”。这类题目在大厂笔试题里很常见考察的不仅是基本功还有对边界条件的敏感度。我当时备考时总结了几条经验现在看依然适用链表题先画图再写码把指针变化画清楚了代码自然就顺了不要上来就硬写。凡是涉及指针移动的题都先想清楚循环结束条件是p ! NULL还是p-next ! NULL很多致命bug都出在这里。树的题目优先考虑递归解法但要想清楚递归的返回值和终止条件如果不确定可以先用递归写通再考虑是否改成迭代。二叉树部分B卷级的题目一般集中在层序遍历、最近公共祖先、路径和这些经典问题上。层序遍历看似简单但不少同学会在“如何区分每一层”这里卡住。标准做法是用一个队列每次记录当前层的节点数然后只处理这么多节点。这个细节我当年就栽过代码逻辑没问题但就是输出分层不对后来才发现是没控制好每次循环的边界。2.2 动态规划与贪心的辨析算法题中动态规划和贪心几乎是必考点B卷也不会绕开。这类题目的难点不在于“会不会写状态转移方程”而在于能否快速判断这道题该用DP还是贪心以及能否把转移方程和初始条件写对。我的经验是拿到一道题先看两个特征能否分解成重叠子问题是否具有最优子结构。如果都满足大概率是DP如果每一步的局部最优就是全局最优且选择之后不影响后续状态可能是贪心。但要注意很多题看似可以用贪心实际却需要DP比如“最长递增子序列”用贪心思想优化没问题但纯粹的贪心选择却会出错。B卷中DP题的难度不会超过“01背包”或“最长公共子序列”这个级别。关键是初始化条件和遍历顺序不能错。我见过很多同学转移方程写得完全正确但dp[0][0]初始化不对或者循环顺序反了导致结果全错。备考时建议把几类经典DP问题自己动手推导一遍别只看不写真正考试时才能真正写得顺手。2.3 手写代码的三个硬性要求笔试编程题手写代码或在线IDE做题我总结了三个硬性要求这也是我给所有准备校招的同学反复强调的边界条件必须考虑全面空数组、只有一个元素、元素全相同、输入特别大这些情况都要想一想。很多题目的测试用例专门设计来卡“没考虑空输入”的人。命名清晰注释适度笔试代码虽然是给自己看的但面试官会回看尤其如果笔试通过进入面试面试官可能会问你当时写的某段代码的思路。命名清晰、结构分明的代码往往会给面试官留下好印象。先写思路再写实现即使题目不难也建议在代码前简单注释一下算法思路。一方面方便自己理清逻辑另一方面也是展示工程习惯。哪怕因为时间紧代码没写完思路注释也能帮你拿到部分分数。3. C/操作系统/网络游戏公司特别爱问的“内功”3.1 C内存管理送分题也是送命题C在游戏公司笔试中的地位不用多说B卷中对C的考察主要集中在指针、内存管理、STL底层、多态与虚函数这几个方向。其中“内存管理”这块最值得展开说因为它既是送分题也是送命题。送分的意思是说如果你认真复习过像“堆和栈的区别”“new和malloc的区别”“内存泄漏是什么、怎么避免”这些题目几乎不需要思考就能写出来。送命的地方在于很多同学只背了结论没有真正理解底层机制。比如题目如果问“为什么new[]要用delete[]来释放”很多人就答不上来——因为这个问题的本质在于new[]会在内存前面记录数组长度delete[]需要读取这个信息来逐个调用析构函数。懂了原理才能举一反三考试时不管怎么变着问都能应对。我当时复习C时用了“三层法”第一层知道结论第二层知道结论为什么成立涉及哪些底层机制第三层能用自己的话把机制讲清楚。应用到内存管理这个主题上就是第一层堆内存需要手动管理栈内存自动回收。第二层栈内存由编译器和CPU自动分配释放效率高但容量小堆内存由操作系统管理容量大但效率和回收依赖程序员。第三层能说明栈帧结构、堆分配器的基本工作原理、内存碎片是怎么产生的。如果你能达到第三层B卷级别的C题目基本横扫。3.2 操作系统与网络编程的常考细节操作系统在游戏服务端开发中尤其重要因为这直接关系到服务器的稳定性和性能。B卷中操作系统相关的题目主要涉及进程与线程的区别、死锁的必要条件、虚拟内存和页面置换算法等。值得注意的是很多题目不会直接问概念而是放在具体场景里考。比如“一个游戏服务器同时在线人数上涨后响应变慢可能的原因有哪些”这道题表面上是在考性能分析实际上考察的是你对进程调度、内存分配、网络IO的综合理解。网络部分则集中在TCP三次握手与四次挥手、TCP与UDP的区别、滑动窗口和拥塞控制。这些考点在很多校招笔试中都会出现但B卷的特别之处在于它会结合游戏场景来问比如“一个MOBA游戏的操作指令应该用TCP还是UDP传输为什么”。这个问题的标准答案背后其实有一层更深的逻辑TCP可靠但延迟高UDP不可靠但延迟低而MOBA的核心是实时性掉几帧可以接受卡顿不能接受。所以很多实时对战游戏会用UDP或自定义可靠UDP协议。回答这种题光是背“UDP快但不可靠”只能拿基础分能把游戏场景的约束和通信机制的选择逻辑讲清楚才能拿高分。这里我建议大家复习时多问自己“为什么”少问“是什么”。校招笔试的简答题答出概念是及格答出原理和适用场景才是优秀。4. 实战解析几道典型题的完整解题路径4.1 字符串处理题边界情况决定成败字符串处理题是笔试中的“常青树”B卷也不例外。这类题看似简单但往往暗藏不少坑。拿“实现一个函数将字符串中的每个单词逆序如 I love you 变为 you love I”这道题来说很多同学写出来的代码看起来没问题但一跑测试就出错问题常常出在空格处理上。我的完整解题路径是这样的先想清楚输入的限制字符串里是否可能有多个连续空格首尾是否有空格这是边界条件的第一关。设计算法先整体反转整个字符串再逐个单词反转。这个方法的巧妙之处在于它把“单词逆序”问题转换成了“局部反转”问题时间复杂度O(n)空间复杂度O(1)。写出代码框架重点处理好空格的索引移动。在脑子里跑几个特殊用例空字符串、只有一个单词、全是空格、多个连续空格。我当时备考时养成一个习惯每写完一道字符串题就专门拿这些边界用例去测自己的代码。笔试现场的测试用例往往是设计过的专门找那些“看起来不难但很容易漏”的边界情况。如果你平时就能把这些边界想全面到考场就不会慌。4.2 设计题如何设计一个游戏中的技能系统B卷最后通常有一两道设计题这类题目是很多同学的噩梦因为它没有标准答案考察的是你的工程思维和知识迁移能力。一个典型题目是“设计一个游戏中的技能系统支持不同类型技能单体伤害、群体伤害、治疗、控制等的释放和效果计算”。这种题千万不要一上来就写代码而要先理清需求。我建议按这个顺序答题先明确系统的核心职责技能释放的流程、效果计算、目标选择、冷却管理。再设计数据结构技能本身可以用一个类或结构体表示包含技能ID、类型、伤害系数、作用范围、冷却时间等字段。用设计模式解决扩展性问题技能系统经典的方案是“策略模式”或“命令模式”每种技能类型封装成一个策略类统一实现一个释放接口。这样新增技能类型时不需要修改原有逻辑只需新增策略类。要考虑性能游戏中的技能释放往往在战斗循环中高频调用不能每次释放都去动态创建一堆对象可以用对象池或预分配来优化。最后补充容错和异常处理比如目标已经死亡、技能处于冷却中、蓝量不足等场景。我在笔试时遇到这类题一般会先花两分钟画一个简单的框架图然后按“接口设计-核心流程-关键实现-扩展性说明”的思路答题。即使时间不够写完整代码也要把核心接口和流程写清楚让面试官看到你有系统设计意识。4.3 系统设计题里小白的常见错误设计题大家最容易犯的一个错误是陷入细节不能自拔死磕某个类的具体实现却忘了先做整体规划。我见过有同学在技能系统设计题里花大量篇幅写伤害计算公式却完全没提技能释放的总体流程和扩展机制。这其实是抓错了重点设计题考察的是“架构能力”不是“计算能力”。另一个常见错误是忽略并发和一致性。如果你的技能系统是服务端设计题那一定要考虑到多个玩家同时释放技能、技能效果同时结算时如何处理数据一致性问题。就算题目没有明确强调你能主动提到加锁、事务、乐观锁或消息队列等方案也会明显加分。这一点在游戏服务端尤其重要因为游戏是强实时交互的系统设计时多考虑并发场景会让面试官觉得你有实战意识。还有一个我自己的体会设计题答案不在于“多”而在于“完整闭环”。一个方案能从需求分析讲到接口设计再从接口设计讲到关键实现最后聊到扩展性和容错哪怕细节不够深入也比零零散散写了一大堆却不成体系要强得多。5. 常见问题与避坑指南5.1 笔试现场最容易翻车的5个地方我根据自己和身边同学的经验整理了笔试现场最常见的翻车点并按重要性排了个序排名翻车点具体表现预防方法1时间分配失衡在选择题上耗时过多导致编程题没时间做先快速扫一遍全卷按分值分配时间编程题预留至少40%时间2审题不清题目要求“只写思路”却写了完整代码或反之下笔前用30秒精读题目圈出关键词3边界条件遗漏代码在常规用例上正确但空输入、大输入直接崩溃写完代码后专门用边界用例“攻击”自己的代码4概念表述混乱简答题能写出关键词但逻辑不通顺、缺乏因果链平时多练习“用完整句子讲概念”不要只背要点5环境不熟悉在线IDE的编译选项、输入输出格式不熟悉考前用目标公司的模拟系统或牛客网练习几套题其中第1点尤其要提醒。我见过太多同学在一道不会的选择题上死磕十分钟结果后面编程题草草收场。正确的策略是选择题卡住先标记做完会做的再回头细想。如果最后实在不会也要凭第一感觉选一个千万不要空着。5.2 如何用一周时间有效备考很多同学问如果只剩一周时间应该怎么准备B卷这种综合性笔试。我的建议是“三轮复习法”第一轮第1-2天梳理知识地图。把数据结构、算法、C、操作系统、网络、数据库这几大块的知识点列成清单对照这份清单逐项自查每项都问自己“能不能说出它是什么、为什么、怎么用”。不需要深入刷题但要确保没有知识盲区。第二轮第3-5天集中刷题。以LeetCode中等难度题目为主每天刷8-10道重点做字符串、链表、树、DP、二分、贪心这些高频类型。每道题做完用一句话总结它的核心思路和解法套路。同时每天花两小时复习概念题用“默写”的方式巩固记忆。第三轮第6-7天模拟考试。找一套往年的综合笔试题或牛客网上的模拟题严格按考试时间来完成。重点是体验时间分配和答题节奏考完认真订正把所有做错的题都研究明白。一周时间虽然紧但足以把基础题的分拿稳。如果时间更充裕建议把第二轮延长到10天以上编程题多做、做透对后续面试的帮助也很大。5.3 考后复盘比分数更重要最后分享一个容易被忽视的点很多同学笔试结束后对完答案就完事了其实这是最浪费的一次学习机会。B卷这类综合性笔试题其实是很好的知识查漏工具考完第一时间把每一道错题、蒙对的题都整理出来分析错误原因比考前的题海战术更有效。我的做法是建立一份“错题本”不记录题目本身而是记录“我为什么错”和“下次怎么避免”。比如“链表反转题边界条件漏了下次先画图再写”“TCP挥手状态答混了下次要理解状态转移而不死背”。这些复盘笔记在后续面试中给了我很大帮助因为很多基础题面试官也会问笔试错过的点面试前再看一遍印象会特别深刻。6. 一点个人体会回头再看完美世界2017校招技术综合B卷它给我最大的启发不是“我答对了几道题”而是让我明白了一个道理校招笔试真正考的不是智商而是学习习惯。基础扎不扎实、有没有主动思考原理的习惯、能不能在压力下稳定输出这些都能从一份笔试卷子里看出来。如果你正在准备游戏公司的校招我的建议是别把B卷当成“题海”里的普通一份而是把它当成一面镜子用它检验自己的知识体系哪里还有洞然后有针对性地补。笔试只是第一步后面的面试会围绕你笔试中暴露出的薄弱点深入追问所以与其临考抱佛脚不如把功夫下在平时。我当年就是做完这份卷子之后把操作系统和网络的知识重新系统过了一遍面试时被问到相关问题才没有露怯。希望这份拆解能帮你少走一些弯路祝你笔试顺利。