尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

快手工程B卷校招笔试全解析:从数据结构到工程思维

快手工程B卷校招笔试全解析:从数据结构到工程思维 2019年春季校园招聘快手给工程方向候选人发了一套名为“工程B卷”的笔试题目。这个命名当时让不少同学紧张了一下以为B卷是备用卷或者是加试卷难度会更高。实际上A/B卷只是同难度不同题面的防抄袭设计。现在回头看这套试卷几乎可以作为“短视频平台工程岗校招笔试”的教科书样本题量不大难度不极端但覆盖面、筛选意图和工程思维权重都拿捏得很准值得后来者反复拆解。准备互联网大厂校招的同学尤其是目标在快手、字节这类短视频赛道的拿这套题去做能力对标非常合适。它不是那种靠刷题量硬堆出来的卷子而是通过题目布局把“基础功、代码落地能力、工程思维”这三件事一起考了。下面我就以过来人的视角把这份工程B卷拆开聊透。1. 工程B卷的来龙去脉一次“防作弊分卷”背后的招聘思路1.1 A/B卷的规则与误解先说一个很多人误解的点A卷和B卷是什么关系校招笔试分A/B卷在互联网公司里是常规操作。A和B两套卷的难度大致相当但具体题目不完全相同有的甚至选择题的选项顺序都会打乱。这样做的最直接目的是防止同一考场内互相抄袭也防止有人在笔试开始后把答案传到网上影响后续批次的公平性。2019年的春招尤其特殊。春招是秋招的补充批时间紧、批次密同一天可能在多个城市同时开考。如果不分卷泄题风险会成倍放大所以A/B卷几乎是标配。工程B卷的“B”不代表“备选”更不代表“简单”它只是同一批题目中的另一个版本。还有一点有意思的是部分公司的A/B卷是不同岗位方向。比如A卷偏后台开发B卷偏客户端或运维方向。如果你投的是后端研发但分到B卷也不用担心因为题目覆盖的基础知识是共通的差异更多体现在一两道问答题的侧重上。1.2 春招工程岗的选拔逻辑理解这套卷子要先理解春招工程岗在干什么。秋招是广撒网候选人基数大笔试主要用来做“初筛”把专业能力不达标的同学筛掉。春招则是在秋招补录的基础上做“精挑”候选人数量少一些但竞争并不因此变弱——很多秋招拿到Offer但没去的同学会继续在春招场里流动。工程岗的笔试筛选逻辑和算法岗有本质不同。算法岗笔试的重点是模型推导、数学功底、机器学习基础而工程岗笔试关注的是三件事基础功扎实不扎实、代码能不能落地、出了问题有没有排查思路。快手2019年的工程B卷正好对应了这三件事基础功通过选择题大范围考察数据结构、操作系统、网络、数据库等核心科目。落地能力通过编程题限时完成考察代码能不能在真实约束下跑通。排查思路通过一些实际场景题考察遇到线上问题时的分析和处理路径。所以这套卷子本质上不是“知识竞赛”而是一场“岗位能力模拟测试”。看懂这一点比死记硬背任何一道题都重要。1.3 快手业务背景决定的知识偏好2019年的快手正处于短视频业务高速扩张期。用户量、视频量、直播场次都在快速增长工程师每天面对的核心问题主要集中在几个方向海量数据的存储与检索、高并发下的接口稳定性、视频推荐链路的低延迟、客户端体验的流畅度。这些业务特点决定了笔试题目不会考特别偏门的知识点。比如它不会问你“红黑树的节点颜色调整过程”这种纯理论题而更可能问“HashMap在并发场景下会出什么问题”——因为后者在真实业务里真的会遇到。同样的道理网络部分一定会围绕TCP、HTTP这些基础协议展开因为线上服务每天都在和这些协议打交道操作系统部分一定会涉及进程、线程、内存因为服务挂了第一件事就是去看线程栈和内存日志。从这个角度看工程B卷的每一道题几乎都能在快手的真实业务场景里找到对应位置。这也是为什么说它“可以当教科书样本来研究”。2. 选择题全覆盖的知识地图从数据结构到Linux2.1 数据结构与算法四成篇幅都在考“常用操作的边界”工程B卷的选择题数据结构与算法占比通常在四成左右。这部分的特点是不考冷门偏题而是热衷把“常见操作”换个方式问考察你到底是真懂还是背会了。我整理了几类当年出现频率很高的题型二叉树给定先序和中序序列求后序序列。这题的思路是先序的第一个节点是根在中序里找到根的位置左边是左子树右边是右子树递归切割即可。有些同学递归思路清晰但一上手写代码就乱说明基础不牢。堆插入和删除的时间复杂度。堆的插入是上浮操作删除堆顶是下沉操作时间复杂度都是O(log n)。如果这题答错后面的优先队列相关题目基本没戏。哈希表HashMap的扩容机制。JDK 1.7的头插法在并发下会形成环JDK 1.8改成尾插法并引入红黑树为什么这么改这背后是对并发安全、查询效率的综合考量。链表环检测问题。快慢指针是最经典的做法但更进一步的追问是“如何找到环的入口”这需要理解相遇点与入口点的数学关系。为什么要考这些因为在短视频业务里每天有海量的视频ID、用户ID、评论ID在内存中流转背后都是哈希表、队列、索引结构在支撑。数据结构的选择直接决定了接口延迟是毫秒级还是秒级。这批选择题还有一个特点会在题目里埋“陷阱选项”。比如考察排序算法时把“稳定排序”和“时间复杂度O(n log n)”交叉排列如果你只记住了“快排是O(n log n)”而忘了“快排是不稳定排序”就容易选错。读题时要特别注意“稳定”“平均”“最坏”这些限定词。2.2 操作系统与计算机网络高并发业务的技术底座操作系统和网络是工程B卷选择题的第二个重头戏合起来约占三成。操作系统题目的高频考点集中在进程与线程、死锁、内存管理这三块。进程与线程进程是资源分配的基本单位线程是CPU调度的基本单位。这个区分看似基础但延伸出来就是“线程切换为什么比进程切换轻量”“多线程共享哪些资源”这类问题都是线上服务排查的基础。死锁四个必要条件——互斥、持有并等待、不可剥夺、循环等待。选择题一般会给你一个具体场景让你判断是否会发生死锁或者问“破坏哪个条件可以防止死锁”。这类题没有难度但容易因为记混而丢分。内存管理页式存储、段式存储、虚拟内存。2019年的题目比较喜欢考“缺页中断”和“页面置换算法”的对比LRU和FIFO是常客。计算机网络的重点则集中在TCP/UDP、HTTP、DNS这三层。TCP部分三次握手和四次挥手是必考题。更细一点的还会问SYN Flood攻击的原理——攻击者发送大量SYN包不回应ACK耗尽服务端的半连接队列。快手这种高并发服务真要遇到SYN Flood影响是灾难性的所以别看这题简单背后是真问题。HTTP部分状态码是选择题常客。301永久重定向和302临时重定向的区别、304协商缓存的含义、503服务不可用的定位思路。2019年特别爱考HTTPSHTTPS握手时证书验证用的是非对称加密后续数据传输用的是对称加密为什么这样设计因为非对称加密慢对称加密快两者结合才能兼顾安全和性能。DNS部分一般会问“输入网址后发生了什么”。这道题虽然经典但很多同学只背了过程不理解每一层为什么存在。比如本地DNS缓存、根DNS服务器、权威DNS服务器的分工本质是在“查询速度”和“数据新鲜度”之间做权衡。2.3 数据库、Linux与语言基础工程落地的最后一公里除了数据结构和网络工程B卷还会覆盖数据库、Linux命令和编程语言基础占比约两到三成。数据库的题目集中在索引、事务、SQL三个方向。索引为什么用B树而不用B树因为B树的数据都在叶子节点且叶子节点之间有链表连接范围查询时只需顺序遍历链表不需要回溯到上一层磁盘IO次数更少。还会考“最左前缀原则”比如联合索引(a,b,c)查询条件里只有b和c时索引失效。事务ACID四个特性以及隔离级别——读未提交、读已提交、可重复读、串行化。MySQL默认是可重复读这个知识点要记牢。更进阶一点会问MVCC多版本并发控制的原理本质上是通过版本链实现读写不互斥。SQL给两张表让你写出特定查询语句。重点考察JOIN、GROUP BY、HAVING的用法以及WHERE和HAVING的区别。Linux的题目就相对直白top看负载、free看内存、df看磁盘、netstat/ss看端口和连接状态、grep和awk做日志过滤与统计。这些命令没有难度但如果你平时只在IDE里写代码、没怎么上过服务器面对这些题目会非常吃亏。语言基础方面C会考虚函数、智能指针Java会考垃圾回收、反射机制。比如“Java中哪些对象可以作为GC Roots”——虚拟机栈引用的对象、静态属性引用的对象、常量引用的对象、本地方法栈引用的对象。这类题没有业务场景铺垫纯粹是考察语言掌握的扎实程度能不能拿分就看平时积累。整个选择题部分给我的感觉是覆盖科目多但每一科的考察深度都控制在“工作后半年内一定会用到”的范围内。难度不是劝退型的但知识面窄的人会明显吃亏。3. 编程题的三级难度台阶从基础语法到系统设计雏形3.1 第一级字符串与数组考察代码基本功工程B卷的编程题通常有3道难度呈现明显的阶梯式上升。第一题基本是“字符串/数组”级别的题目比如反转字符串、合并有序数组、判断括号合法等。这类题不考算法考的是三件事能不能写出干净的代码、能不能处理边界条件、能不能在限时内完成。以“反转字符串”为例很多人第一反应是直接调用库函数但笔试环境未必允许使用库函数或者题目会明确要求“手写实现”。更关键的是边界条件字符串为空怎么办、只有一个字符怎么办、使用双指针从两端向中间交换时循环终止条件是什么。这道题的意义在于建立信心也在于给面试官一个基础信号如果连这题都写不利索后面两道基本不用看。3.2 第二级算法设计与复杂度控制第二题开始上强度通常是大规模数据下的算法设计可能是二分、双指针、单调栈或简单动态规划。这道题是区分“会用API”和“懂算法”的分水岭。以一道典型的“最长无重复子串”为例暴力解法枚举所有子串判断每个子串是否有重复字符时间复杂度O(n³)在小数据量下能跑通但一旦数据范围到10^5直接超时。优化解法双指针哈希表。右指针不断扩张遇到重复字符时移动左指针同时用哈希表记录每个字符最近出现的位置。时间复杂度O(n)空间复杂度O(n)。为什么工程B卷喜欢考这类题因为在真实的推荐系统、日志处理场景里处理的对象都是海量数据O(n²)和O(n)的差异就是“跑不完”和“秒出结果”的差异。笔试环节用算法题来验证你对复杂度的敏感度非常高效。这道题还有很多变形滑动窗口最大值、和为K的子数组、接雨水单调栈。核心都是双指针或单调栈思想。备考时把这几类经典题吃透比刷100道冷门题更有效。3.3 第三级工程场景题没有标准答案的加分项编程题第三题经常是综合题给你一个业务场景要求设计数据结构或实现一个功能。2019年快手工程卷的方向比较流行两类第一类是“设计一个支持过期时间的缓存”。这道题听起来高大上本质是LRU Cache的变种。LRU Cache的标准实现是哈希表双向链表哈希表负责O(1)的查询双向链表负责O(1)的删除和插入每次访问节点就把它移到链表头部链表尾部就是最近最少使用的节点。加上过期时间后还需要在get时校验当前时间与节点时间戳。第二类是“统计某段时间内视频播放次数的TopK”。这个更贴近快手的业务。解法思路是先用哈希表统计每个视频的播放次数再维护一个大小为K的小顶堆遍历哈希表时如果当前次数大于堆顶就替换堆顶并调整堆。时间复杂度O(n log k)空间复杂度O(n)。如果数据量极大还可以用“分桶MapReduce”的思路但这个在笔试环境里不一定有时间写完整。第三题的评分标准很灵活没有唯一答案。它考察的是整体思路、复杂度分析、边界处理和代码完整度。如果你能写出清晰的结构即使没有完全通过后台测试用例面试官也会看到你的工程能力。相反如果你只写了一个思路但没有代码得分会非常低。4. 笔试里最容易被扣分的五个隐性细节4.1 边界条件空值和越界是最大的“隐形杀手”我见过太多同学算法思路完全正确但代码在边界条件上翻车。常见的边界场景包括链表为空、只有一个节点、只有两个节点时操作是否正确。字符串为空、全部是空格、包含Unicode字符时处理是否正确。数组长度为0、数组越界、负索引、整数溢出。以整数溢出为例很多题目会考察“大数相加”或“反转整数”。题目给出的输入范围是int范围内但反转后的结果可能超出int范围。这时候你必须考虑用long接收或者在做加法时判断是否溢出。如果你以为所有整数都是无限大的后台测试数据会把你打回原形。处理边界条件的能力本质上是代码健壮性的体现。线上环境不会给你一个“完美输入”用户传进来的数据永远有各种意外。笔试这道关卡就是在测试你的防御意识。4.2 数据范围与时间复杂度O(n²)注定过不了大数据工程B卷的编程题通常会明确给出数据范围。比如数组长度N≤10^5这意味着几乎所有O(n²)的解法都会超时你必须设计O(n log n)或O(n)的解法。很多同学在本地跑小数据用例时觉得没问题提交后却收到“Time Limit Exceeded”原因就是没有根据数据范围预估复杂度。这里可以教大家一个简单的估算标准N10^3O(n²)勉强可跑。N10^5O(n²)基本超时必须O(n log n)。N10^6O(n log n)可能超时优先O(n)。写代码时先看数据范围再定算法策略这是工程B卷想考察的核心素养之一。实际工程里的“性能优化”起点也是先算复杂度再决定要不要上缓存、要不要改架构。4.3 二分查找的溢出陷阱一个看似简单实则容易错的地方二分查找是选择题和编程题都喜欢考的内容但里面藏着一个经典陷阱int mid (left right) / 2; // 错误写法 int mid left (right - left) / 2; // 正确写法为什么第二种写法更安全因为当left和right都是很大的int时left right可能超出int上限导致溢出变成负数mid计算错误。这在数值很小的时候看不出问题但一旦数据范围到10^9级别就会踩坑。同样的问题出现在“两数相加”“面积计算”等场景。凡是有加法的地方都要考虑溢出风险。这是工程思维和刷题思维的差别——刷题思维只关心思路工程思维关心的是在任何输入下代码都不会出错。4.4 输入输出格式白板编辑器后台判题的严格性校招笔试环境一般是白板编辑器后台判题没有自动补全没有格式化工具输入输出格式必须严格匹配题目要求。常见的输出问题多个结果之间是空格还是换行。行尾是否允许有多余空格。输出浮点数时是否保留指定位数小数。整数输出时是否有前导0。这些问题看似微不足道但在后台判题系统里就是“Wrong Answer”和“Accepted”的区别。我的建议是写完代码后手动模拟一遍输入逐步检查。还有一个容易被忽略的点有的题目输入可能包含多组测试数据需要循环读取或者第一行是数据组数T后面是T组输入。如果你没有处理多组输入只跑了一组就返回结果后台测试会直接判错。4.5 语言选择用最熟的语言而不是看起来更友好的语言笔试环境通常支持C、Java、Python不同语言在一些细节上会影响得分。Python写起来快但运行速度慢有些时间复杂度临界点的题目可能超时。C运行快但手写代码量多容易出语法错误。Java介于两者之间但有些复杂数据结构需要写更多代码。我的建议是用你最熟练的语言而不是题目看起来更友好的语言。时间有限不要在笔试中挑战不熟悉的语言。如果你平时主用Python就全程用Python如果主用C就别临时换Java。选择熟悉语言的核心原因是减少调试时间——笔试最宝贵的就是时间。5. 笔试分数不是终点分数如何影响面试5.1 笔试在招聘漏斗中的作用快手2019年春招的完整流程是网申 - 笔试 - 技术一面 - 技术二面 - HR面 - Offer或人才库。笔试是进入面试环节的入场券但不是决定录取的唯一因素。它更重要的作用是排序——在众多候选人中把分数分成几个梯队从高到低安排面试批次。有些同学会问笔试没过是不是简历直接被扔掉了说实话在大部分公司是这样的。但也有少数情况如果简历非常亮眼比如有大厂实习、开源项目、竞赛获奖面试官可能会争取加面机会。只是这种情况在春招这种时间紧迫的批次里比较少见。5.2 排名制逻辑笔试不是及格考试理解校招笔试最重要的一点是它不是及格考试而是排名考试。很多同学问我笔试考多少分才能进面试。这个答案很残酷——取决于同批竞争者的水平。如果你的分数是70分其他人都考80分你依然可能被筛掉如果你考60分其他人都是50分你反而能进面试。2019年快手的工程B卷整体难度并不算特别高。真正的区分点在于编程题能不能写对选择题在细节上会不会丢分。很多同学选择题能拿到60%以上的分数但编程题三道只AC了一道最终排名就没优势。5.3 代码可读性带来的复议机会第二个容易被忽略的点是工程B卷的编程题除了系统自动判定还有人工复核环节。尤其是编程题接近通过但没完全跑通的场景面试官可能会手动打开代码看逻辑。这时候代码的可读性就非常重要变量命名是否清晰是用a、b、c还是使用userCount、maxHeap。注释是否能解释关键思路。代码结构是否清晰有没有把核心逻辑拆成函数。是否考虑了边界条件并做了防御性判断。如果你的算法思路正确但因为一个小细节没跑通而代码结构又很清晰面试官大概率愿意给面试机会。如果你的代码一团乱麻即使跑通了也会影响面试官对你的印象。所以笔试时不要只追求“写完”要追求“写清楚”。这和写业务代码时的Code Review是一个逻辑。6. 基于B卷总结的备考路线6.1 模块化刷题不要堆题量很多同学备考时喜欢每天刷10道题但刷完就忘效果很差。我建议按模块刷题每个模块集中攻克系统性建立知识体系。具体路线第一阶段数据结构。重点攻克数组、链表、栈、队列、哈希表、二叉树、堆。不仅要会用还要理解每种数据结构的适用场景和复杂度。第二阶段算法思想。重点攻克双指针、二分、滑动窗口、BFS/DFS、动态规划、贪心。每类题至少精做15道理解“为什么这样解”而不是“答案是什么”。第三阶段系统设计雏形。重点攻克LRU、TopK、限流算法、短链设计等工程场景题。这部分最能体现工程思维也是面试官最看重的。6.2 模拟笔试与时间分配工程B卷的题量按照正常水平时间分配建议是选择题控制在35到40分钟编程题每道控制在15到20分钟最后留10分钟检查。为什么选择题要严格控制时间因为选择题分值占比高但单题难度低不能在上面浪费太多时间。如果一道选择题超过3分钟还没答案先标记跳过做完编程题再回头想。模拟笔试时要注意使用白板编辑器不要依赖IDE的自动补全。严格限时模拟真实考场的时间压力。尽量在纸上或注释里写出伪代码理清思路后再写正式代码。6.3 技术储备与业务理解除了刷题我强烈建议备考时去了解一下目标公司的业务和技术栈。2019年快手工程B卷的题目很多都能从业务角度找到解释。比如考缓存设计因为快手有海量的视频元数据需要缓存考TopK统计因为热门视频排序是核心业务逻辑考TCP和HTTPS因为移动端的网络请求质量直接影响用户体验。你可以做两个准备阅读目标公司的技术博客、开源项目了解他们在线上的技术选型。整理一份“技术栈与业务题目映射表”比如“秒杀场景-缓存/队列/限流”“热门榜单-TopK/堆/排序”“日志分析-MapReduce/分桶”。当你发现笔试题目和业务场景能对应上时你对题目的理解深度会完全不一样。6.4 错题整理与复盘方法最后聊一下错题整理。我见过很多同学刷题时对答案觉得“看懂了”就跳过下次遇到还是不会。真正有效的复盘方法是每题准备一个文档记录题目、错误原因、正确思路。错误原因分类是知识点缺失、边界条件没考虑、复杂度分析错误还是纯粹粗心。把同类型的错题放在一起对比总结出共性的盲区。以二分查找为例如果你在“溢出陷阱”上犯错就把所有二分查找相关题目集中起来专门练习mid的写法直到形成肌肉记忆。下次写任何涉及二分查找的题目时第一反应就是left (right - left) / 2。错题本不是写给文档的是写给下一次笔试的自己看的。每次笔试前翻一遍错题本比临时刷10道新题更有效。最后分享一点个人经验。这些年我面试过不少新人也和出题的同事聊过笔试设计的初衷。对于工程方向的校招笔试从来不是为了把所有人考倒而是要把“能做事情的人”和“只会背书的人”区分开。快手2019年工程B卷之所以值得复盘正是因为它把“基础、落地、工程思维”这三个维度展现得很完整。如果你打算投这类公司的工程岗建议把这份试卷当成一面镜子对着它检查自己的知识盲区。补上那些“看起来简单但实际上会出错”的细节比闷头刷几百道偏题更有价值。
返回列表