
快手2020校园招聘秋招笔试的工程B试卷在当年算是比较有代表性的互联网大厂笔试题目。我那时候正好帮几个学弟学妹做过试卷复盘自己也研究过这套题的结构和考点今天就把这套卷子掰开揉碎了讲讲。对于准备互联网公司校招笔试的同学来说这份拆解能帮你搞清楚大厂笔试到底在考什么、怎么分配时间、哪些分该拿哪些分可以放同时也能顺着这套题看到快手当时对工程方向候选人的能力预期。1. 项目概述一份笔试背后的招聘逻辑1.1 快手2020秋招的背景与目标先说说时间背景。2020届秋招是2019年下半年进行的那会儿快手正处于快速扩张期日活用户持续攀升整个公司在短视频赛道上和对手打得很激烈。这种背景下工程方向的招聘需求非常大尤其是后端开发、基础架构、客户端开发这几个方向都需要大量能快速上手干活的人。但问题来了校招候选人来自全国各地的高校学校教的课程千差万别项目经验也是五花八门。有的同学在实验室里写了很多代码有的同学主要在刷题应付面试有的同学可能连Git都没怎么用过。用一份统一试卷去筛选核心目标就是在最短时间内用最低成本筛出具备扎实基础功、有良好算法思维、能解决实际问题的人。所以这份试卷的设计逻辑本质上就是一套标准化的人才过滤器。它不追求你能做多复杂的项目不要求你有出色的实习履历它只考察三件事基础扎不扎实、思维清不清晰、代码写不写得出来。1.2 工程B试卷的定位与考察对象先说结论工程B试卷主要面向的是后端开发、基础架构、系统研发这类偏底层、偏服务的工程岗位。为什么叫B卷因为快手秋招同时会有多套试卷——比如A卷可能是算法方向的C卷可能是客户端方向的D卷可能是测试开发方向的。不同岗位对技能要求侧重点不同出题方向自然就有差异。工程B卷的考察重点概括起来是三个字广、深、活。广是指覆盖计算机基础知识的范围广从操作系统到网络协议从数据库到编程语言都会涉及。深是指对核心知识点不只是停留在概念层面而是往原理深处多问几层比如问你某个机制为什么这么设计、如果去掉某个环节会怎样。活是指题目场景贴近真实工程问题不是死记硬背就能答出来的需要灵活运用知识去分析。这套卷子适合谁来参考如果你是准备互联网大厂校招笔试的应届生尤其是后端、基础架构方向的这份拆解能帮你理解出题人的思路。如果你是大二大三的学生想提前了解校招笔试的难度和方向这份拆解也能给你一个清晰的路线图。即使你不是应聘快手的这套卷子代表了大厂工程岗笔试的主流风格参考价值非常高。2. 试卷结构与考察维度拆解2.1 整体题型分布解析工程B卷的题型结构和大多数互联网公司校招笔试基本一致主要分为三大块选择题、编程题、简答题。选择题部分一般占据60%左右的比重数量在20到25道之间涉及的维度非常广。我印象比较深的是这套卷子的选择题不是单纯考概念记忆而是大量采用给一段代码问输出结果给一个场景选最优方案这种形式。比如给你一段涉及指针操作的C代码让你判断输出什么或者给你一个线上服务响应变慢的故障场景让你从四个选项里选出最可能的原因。这种题目真正考察的是你读代码、分析问题的能力靠背题是过不了的。编程题通常是2到3道分值占比30%左右。说实话编程题是拉开差距的核心环节——选择题大家都答得差不多但编程题会做的和不会做的差距非常大。快手当年的编程题难度大致在LeetCode中等偏上水平不涉及特别偏门的算法但会在常用算法的基础上加一些变化考察你对算法本质的理解而不是死记模板。简答题占比10%左右一般是1道系统设计题或者场景分析题。比如说设计一个短链系统分析一个高并发场景下缓存和数据库一致性问题这类。题目本身不难但考察的是你的工程思维是否完整能不能从全链路角度去思考问题。2.2 各模块分值权重与时间分配我当时给学弟学妹们分析这套卷子的时间分配时特别强调过一个观点笔试不是考试是时间管理游戏。90分钟的笔试时间怎么分配直接决定你能拿多少分。我建议的时间分配策略是这样的模块题量建议用时核心策略选择题20-25题30-35分钟会做的果断选不会的先标记跳过不纠结编程题2-3题40-45分钟先做有清晰思路的留15分钟处理最难题的暴力解简答题1题10-15分钟列要点画框架不追求长篇大论很多同学栽在选择题上因为遇到一两道不会的题目就开始纠结时间白白浪费直接导致后面的编程题没时间做。我的经验是选择题每道题不超过1分钟超过就跳过整个选择题部分控制在35分钟内必须结束。分值权重上编程题是绝对的大头。一道编程题AC和不是AC差距可能比五道选择题加起来还大。所以哪怕选择题有几道不会只要你编程题做出来了总分依然不会差。反过来选择题全对但编程题一道没做出来基本就没戏了。3. 核心考点深度解析算法与数据结构3.1 高频算法题类型分析我复盘过2020年前后多家大厂的工程岗笔试试卷发现题型高度集中快手这套B卷也不例外。高频出题类型集中在以下几类字符串处理类。这类题看起来简单但坑很多。比如给一个字符串要求按规则做某种变换或者找最长回文子串、最长无重复字符子串这类经典问题。之所以高频出现是因为字符串处理能综合考察指针操作、哈希表使用、边界条件处理能力。链表与树的操作。链表反转、链表合并、判断是否有环、二叉树遍历的递归与非递归实现、最近公共祖先等属于必考范围。这些题算法本身不复杂但非常考验代码基本功。我见过很多同学链表题思路完全正确但代码写出来一堆空指针错误这就是平时手写代码练习不够。动态规划。说实话动态规划是笔试的试金石。背包问题、最长递增子序列、编辑距离、区间DP这些经典模型基本是轮流出现。快手这套卷子的DP题我记得有一道是编辑距离的变种不是直接考LeetCode原题而是换了种描述方式但实际上还是同一个模型。二分查找与双指针。有序数组相关的操作、滑动窗口、双指针法尤其是带有求满足条件的最小区间/最大长度这类问题出题概率极高。这类题考察的是你对单调性的理解能不能判断出什么时候该用二分、什么时候该用双指针。3.2 经典例题的解法思路这里我挑一套比较有代表性的题目来拆解大家可以感受一下出题风格。题目描述给定一个字符串s和一个字符串t你可以在s中删除一些字符使得剩下的字符能够组成t的一个排列。请返回最少需要删除的字符个数。很多人看到这题第一反应是这不就是判断s是否包含t的某个排列吗然后想到滑动窗口。但仔细想想这题有个关键差异它允许你删除字符所以要找的是s中能匹配t的某个排列的最长子序列。用滑动窗口做连续子串的解法就不适用了得换个思路。正确的解法是统计t中每个字符的出现次数然后在s中遍历所有字符用哈希表统计s中出现的字符频次。对于每个字符如果它在t中出现次数少于其在s中的出现次数超出的部分就是需要删除的。这个思路的核心是我们只关心字符频次的差值不关心字符的相对顺序。这种题就是典型的变型题看起来像你刷过的经典题但实际考察的是你能不能跳出原有模板抓住问题的本质特征。解题的关键不是背模板而是理解每个算法背后的适用条件。再看一道典型的二分答案题给定一个正整数数组和一个目标值k要求判断是否存在一个长度为k的子数组使得该子数组的最大值和最小值之差不超过某个阈值。这类题有两个常见解法——一个是用滑动窗口配合单调队列维护最大值和最小值复杂度O(n)另一个是直接用双指针维护一个可变窗口每次扩展右指针收缩左指针来保证窗口内的差值满足条件维护窗口内的最大值和最小值即可。这类题目考察的核心能力是你能否识别出连续子数组 区间最值这个组合特征并快速联想到单调队列或双指针解法。我在给学弟们讲题时一直强调刷题到后期重点不是刷了多少题而是能不能对题目特征形成条件反射式的联想。3.3 复杂度分析与优化技巧做完题目之后复杂度分析这块很多人会忽略但其实在笔试评分里很重要。一些平台上即使你的答案能通过测试用例如果复杂度过高依然会判为超时或者低分。我见过太多人写出了O(n^2)的解法测试用例小的时候能过换大数据量就超时了。在笔试中一个非常实用的优化思路是先写暴力解再做复杂度分析然后寻找可优化的环节。比如暴力解法是O(n^2)的遍历你发现每次都要重复计算子区间的某种属性这时候就应该想到用前缀和、滑动窗口、单调栈这类技巧把重复计算消除掉降成O(n)。另一个值得提的优化方向是空间换时间。有些题目你用一个额外哈希表或者数组就能把时间复杂度从O(n^2)降到O(n)笔试中是完全可以接受的因为内存限制通常比较宽松。很多同学过于追求零额外空间的极致优化结果代码写复杂了反而更容易出错。在笔试这个场景下清晰的O(n)空间解法远好过写不出来或者写错的O(1)空间解法。动态规划类题目还有一个经典优化技巧——状态压缩。比如二维DP的转移只依赖上一行的状态那你完全可以把二维数组压缩成一维从空间O(n^2)降到O(n)。这类优化不改变时间复杂度但能降低空间消耗在空间限制比较紧的题目里很关键。不过还是那句话先保证正确性再谈优化。4. 计算机基础与工程能力考察4.1 操作系统与网络核心问题工程B卷的选择题里操作系统和计算机网络是分值大户。就快手这套题来说操作系统部分的考点集中在进程与线程、内存管理、死锁、调度算法这几个方向。进程与线程必然是选择题常客而且出题方式倾向于概念辨析。比如问你多线程中哪些资源是共享的哪些是独立的这类题看似简单但很考验概念的准确度。我见过有的同学在线程共享进程的地址空间但栈和寄存器是独立这个点上理解不准确题目稍微变一下说法就选错了。内存管理这块虚拟内存、分页、页面置换算法是热点。记住LRU的底层实现是哈希表加双向链表这是面试笔试都爱考的。网络部分TCP的三次握手和四次挥手的各种变型题属于必考的。但要注意快手这套卷子不会直接问你握手步骤而是给了一个场景比如假设网络延迟很高TCP连接建立的时间会怎样变化让你分析。这种考法考察的是你有没有真正理解握手机制的意义而不是死记状态迁移图。HTTP协议也是高频考点尤其是HTTP/1.1和HTTP/2的区别、HTTPS的加密流程、以及常见的状态码含义。这些题不难只要系统过一遍TCP/IP原理相关的资料基本都能做对。4.2 数据库与缓存设计思路数据库这部分快手这套B卷的题目风格比较偏实战。什么样的实战呢就是给你一个业务场景让你判断该用什么样的索引、该怎样优化一条SQL语句、在什么情况下会锁表、为什么某个查询很慢。索引这块最核心的是搞清楚聚簇索引和非聚簇索引的区别以及联合索引的最左前缀原则。笔试中常见的形式是给你一张表和三个查询条件问该建立什么样的联合索引为什么。这类题需要你不仅知道概念还能根据查询语句的WHERE条件判断索引的排列顺序。事务和隔离级别也属于必考范围。脏读、不可重复读、幻读这几个概念对应哪些隔离级别MVCC的工作原理是什么快照读和当前读的区别是什么都是高频考点。我建议准备这类题时不要背而是建立一个模型去理解事务的隔离级别本质上是在并发性能和数据一致性之间做取舍理解了这一点题目怎么变你都能分析。缓存部分大概率会有Redis相关的题目。比如缓存穿透、缓存击穿、缓存雪崩的定义和应对方案以及缓存和数据库的一致性如何保证。这类题在笔试中以选择题和简答题两种形式出现。简答题如果考到缓存一致性有一个通用的回答框架先说明问题的背景为什么会出现不一致再列出几种常见方案先更新数据库再删缓存、延迟双删、消息队列异步同步等最后分析每种方案的优缺点和适用场景。这个框架能保证你拿到基础分如果还能结合具体场景给出选型理由就能拿到高分。4.3 编程语言与代码质量考察工程B卷会涉及编程语言的基础知识。快手这套卷子主要考察C和Java但以C为主这也符合快手的后端技术栈特点。C的考点集中在指针与内存管理、构造函数与析构函数、虚函数与多态、STL容器的底层实现。比如vector扩容的机制是什么复杂度是多少这类题目看起来是问语言细节实际上考察的是对底层实现的理解。再比如智能指针为什么能避免内存泄漏shared_ptr的引用计数存在哪里能答出引用计数存在控制块中每个shared_ptr对象中有一个指向控制块的指针这样的人说明真的是写过代码、踩过坑的。有些同学觉得笔试主要靠刷算法题编程语言基础可以忽略。这是一个很大的误区。编程题你要用某种语言来写如果语法不够熟练编译都过不了。选择题里关于语言的题往往是直接送分的因为只要认真上过课、写过作业就能答对不需要多少天赋。这部分分不拿太可惜了。代码质量这块很多笔试系统会检查代码风格和注释情况有些甚至会自动判卷代码的可读性。虽然主要判分标准还是答案正确性但保持良好的命名习惯、写上关键注释、注意代码缩进这些都能给面试官留个好印象。我见过有的同学代码写的答案完全正确但变量名全是a、b、c函数逻辑一大坨没有任何注释这种代码在实际工程中是没人敢接手的。5. 备考策略与实战经验分享5.1 时间规划与刷题路径聊完卷子本身的结构和考点接下来说点更实际的——怎么准备这种考试。我见过的成功案例备考路径高度相似大致可以分为三个阶段。第一阶段是基础复习建议考前4到6周开始。这一阶段以教材为主把数据结构与算法、操作系统、计算机网络、数据库这四门核心课程的经典知识点重新过一遍。这一轮不要追求细节重点是建立知识框架把每个知识点的核心概念和原理搞明白。第二阶段是专项刷题建议考前2到4周。每天固定刷3到5道算法题覆盖动态规划、字符串处理、二叉树、链表、二分查找这几个高频专题。刷题时不要边看题解边写先独立思考20分钟写不出再看题解看完题解关掉自己重写一遍。这个先独立想、再对照、再复现的过程比闷头刷100道题都管用。第三阶段是模拟实战建议考前1周。找几套往年大厂的笔试真题严格按90分钟限时模拟。模拟的关键不是做对多少而是找到自己的时间分配节奏感。你会在模拟中发现自己在哪个环节卡壳最多然后针对性地补强。注意模拟时就要用笔试系统练熟悉输入输出的处理方式特别是那种需要你处理多行输入、字符串split、转换成数字的情况很多人在这一步栽跟头——明明算法思路对就是输入输出不会处理导致0分。5.2 考场实战技巧时间分配与做题顺序考场上很多同学习惯按题目顺序做这其实不是最优策略。我的建议是先快速浏览所有题目然后按性价比排序——先做自己最有把握拿满分的题再做需要思考一会儿的题最后做完全没有思路的题。编程题的顺序也有讲究。如果三题中有一题特别简单一般是第一题先把这题的分数稳稳拿到手确保不出现最简单的题目因为粗心而0分的悲剧。然后去做你觉得思路最清晰的题最后留时间给最难的题。对于最难的题我的经验是哪怕拿不到满分也要写暴力解。笔试系统按测试用例给分暴力解能过部分小数据量的用例就有部分分数。很多同学觉得暴力解丢人直接放弃不写这一下就丢掉了可能拿到的30%分数非常可惜。选择题的实战技巧拿不准的题目用排除法先排除明显错误的选项再在剩下两个里选。如果实在不会不要空着。笔试一般按答对得分、答错不扣分的方式来计分所以蒙一个答案也比空着强。但这里有个小细节有些笔试是答错扣分的比如答错扣0.5分这通常是少数情况建议在进考场前先搞清楚规则。还有一点做编程题时一定要先看清楚题目给的输入范围和内存限制。这直接决定你的解法可以用什么复杂度。如果n最大是10^5你的O(n^2)算法大概率超时如果n最大是200O(n^2)完全没问题。这就是为什么我说笔试不只是考验算法能力也考验信息获取和判断能力。5.3 常见失分点与避坑清单我复盘了大量同学的答题情况总结出几个高频失分点每个都值得你记在本子上。第一个失分点是审题不清。很多同学拿到题目看了一半就开始动手结果做完整道题才发现自己理解错了题意。笔试编程题的文字描述通常比较长里面有大量信息是干扰项。正确做法是先把题目完整读两遍在草稿纸上用自己的话复述一遍题目要求然后看输入输出样例确认自己理解无误再动笔。第二个失分点是输入输出处理。笔试系统的输入格式往往和平时的本地测试不一样经常要处理多行输入、特定分隔符、直到EOF等情况。有的同学代码逻辑完全正确但因为没有处理对输入格式导致运行时直接报错0分。这非常冤枉。建议考前把常见语言的标准输入输出写法背熟尤其是C的cin、cout和Java的Scanner、BufferedReader。第三个失分点是边界条件测试不足。写完代码后别急着提交。先用几组边界数据自测空的输入、只有一个元素、最大数值、重复元素、字符串长度为1等。我见过太多代码在正常用例下完全正确但对空输入直接报异常。有的笔试系统会有一部分用例专门设计为边界用例你没有考虑边界情况就等于白丢这些分。第四个失分点是动态规划的状态定义不清晰。很多人见到DP题凭感觉写一个状态转移方程没有真正搞清楚dp[i]代表什么含义导致转移方程错误或者索引越界。我的建议是写DP题时先写注释把dp[i]的含义说明白再写转移方程最后才对代码。这个习惯能帮你理清思路也能让阅卷人看到你的思维过程。第五个失分点是时间分配失误。选择题里卡壳太久导致编程题没时间写编程题里死磕难题导致简单的题都没时间提交。这两个是笔试的大忌。记住一句话笔试追求的是总分最大化不是单题满分。某道题不会果断放弃把时间留给能拿分的题。6. 从笔试到Offer后续流程衔接与个人体会6.1 笔试通过后的面试准备如果你顺利通过了笔试恭喜你你已经在第一轮筛选中胜出了。但笔试只是开始后面的面试才是真正的考验。快手的面试流程一般是两到三轮技术面加一轮HR面。技术面会围绕你的简历、基础知识和项目经验展开。笔试到面试之间的那段时间建议做三件事第一把笔试中做得不好的题目再刷一遍面试官很可能会在你自我介绍之后追问你笔试中某道题是怎么想的当时为什么没做出来这时候你能清晰地复盘会让面试官觉得你有总结反思的能力。第二准备好自我介绍和项目描述用STAR法则把自己的项目经历梳理清楚。第三把笔试中暴露出来的薄弱环节补一补比如你笔试中发现自己对索引理解不深面试前就重点补这块。面试中的算法题难度通常和笔试差不多但有时候更偏向让你现场讲思路。面试官会一直追问为什么会想到这个解法还有没有更优的方案如果数据量扩大100倍会怎样这种追问往往比笔试更考察思维深度。6.2 关于这套卷子的个人复盘与扩展建议说实话我研究这套卷子不只是因为要帮学弟学妹备考。更重要的是它很好地代表了那个时期互联网大厂工程岗对校招生的核心期待。我在拆解过程中发现这份卷子的出题水平确实不错覆盖面很广但每一道题都有明确的考察意图不是随便拼凑的。从我个人的体会来说这道卷子最核心的考察逻辑是它不关心你做过什么它关心你能做什么。你可能没有大厂实习经历可能没有高含金量的项目但只要你的基础够扎实、代码能力够硬、逻辑思维够清晰你就能在这份卷子上拿到不错的分数。这种筛选逻辑某种程度上对普通院校的同学是友好的——公平竞争凭实力说话。最后再分享一个小技巧。做完这套卷子复盘时不要只看自己哪道题做错了而是要统计自己在哪些考点上失分最多。如果失分集中在算法题上说明刷题量还不够需要继续加大练习强度如果失分集中在操作系统和网络上说明需要回归课本把这些科目的知识框架重新梳理一遍如果失分集中在编程题超时上说明代码熟练度不够需要多写多练。这种定向补强的方法远比盲目刷题效率高得多。这套卷子的价值其实也不局限于快手一家。我后来让准备其他大厂笔试的同学也做了这套题发现考点重合度在80%以上。把这一份卷子吃透就等于给多家大厂的笔试做好了铺垫。如果你正在准备秋招建议不要只刷LeetCode适当地去研究一些大厂往年的真题理解它们是怎么把考点落到题目上的——这种从题目反推考点的能力对你后面的笔试和面试都会非常有帮助。