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

资讯详情

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

B站2020校招后端笔试卷解析:考点、难度与避坑策略

B站2020校招后端笔试卷解析:考点、难度与避坑策略 看到“哔哩哔哩2020校园招聘后端笔试卷二”这个标题估计很多准备校招的同学第一反应是去牛客网翻面经、找原题。但说实话光背题目没什么用B站这类公司的笔试卷每年题型都大同小异核心考的东西非常稳定。与其去找一份可能已经失效的题目截图不如彻底搞清楚这套卷子背后到底在筛选什么。这篇文章我就结合B站后端校招的出题逻辑把这类笔试卷的考点、难度、做题策略和避坑经验一次讲透适合正在准备大厂后端校招、或者想系统查漏补缺的同学参考。1. 这套笔试卷到底考什么——B站校招后端出题逻辑拆解1.1 B站后端的技术栈与出题方向先聊个很多人关心的问题B站后端到底用什么语言考Java还是Go实际上B站的技术栈经历了几次演变早期有大量PHP业务后来核心服务逐步转向Go和Java不同部门用的语言并不统一。所以校招笔试基本不会限定单一语言C、Java、Go、Python都能交卷阅卷时重点看你的解题思路和代码质量不会因为你没用某个“官方语言”就扣分。但题目方向是明显偏工程化的。为什么因为B站的核心业务是视频社区用户刷视频、发弹幕、看评论、充会员这些场景有一个共同特征读多写少、热点集中、流量波动大。因此笔试里经常出现缓存设计、消息队列削峰、热点数据隔离一类的题目不是单纯考算法而是考“你在真实业务里能不能用后端工程手段解决问题”。这也意味着备考时不能只刷LeetCode还得把计算机基础和后端组件原理串起来。我见过不少同学算法题能AC但一碰到“如何设计一个高并发点赞系统”这种题就懵。B站笔试卷中的设计题恰恰是拉开分数差距的地方。1.2 笔试卷的题型结构与采分点从历年的招聘情况来看B站2020届校园招聘后端笔试卷二这类卷子一般分四个部分单选题、多选题、编程题、简答/设计题。别小看前面那些选择题它们筛掉的人往往比编程题还多。题型常见考察点建议用时踩坑重灾区单选语言基础、操作系统、网络、数据库概念20分钟概念混淆特别是TCP和UDP的细节多选并发、Redis、MySQL、Linux命令15分钟少选漏选多项选择通常按完全匹配给分编程题数据结构、算法、边界处理60分钟时间复杂度超限、int溢出、空指针简答/设计分布式、缓存、系统设计、场景题30分钟只给结论不给推导过程这里有个容易忽略的采分点编程题不是运行通过就满分阅卷系统通常还会看代码风格和边界条件。B站的题目描述里经常埋一些特殊输入比如空字符串、超大整数、重复节点这些都是送分点也是送命题。很多人刷题习惯了核心代码模式一碰到ACM模式就不知道怎么处理输入输出这一块得提前练。2. 核心考点逐题拆解算法、网络、数据库一个不落2.1 算法题考的不是难题是熟练度和边界感B站这类笔试的算法题难度一般集中在LeetCode中等题偶尔压轴题会到困难级别但不会出那种纯竞赛思维的题。比较常见的有最长无重复字符子串、LRU缓存、合并K个有序链表、二叉树层序遍历、TopK问题等。以“最长无重复字符子串”为例这题在B站笔试卷中出现频率极高。为什么因为它背后映射的是弹幕内容去重、敏感词匹配时的滑动窗口思想。标准解法是用一个哈希表维护字符最后出现的位置同时维护左边界指针遍历一次就结束时间复杂度O(n)。核心代码其实不长public int lengthOfLongestSubstring(String s) { MapCharacter, Integer lastIndex new HashMap(); int maxLen 0; int left 0; for (int i 0; i s.length(); i) { char c s.charAt(i); if (lastIndex.containsKey(c) lastIndex.get(c) left) { left lastIndex.get(c) 1; } lastIndex.put(c, i); maxLen Math.max(maxLen, i - left 1); } return maxLen; }这段代码里有几个容易被忽略的细节lastIndex.get(c) left这个判断必须有否则会出现左边界已经越过该字符却还拿旧位置来更新left的错误然后是HashMap要初始化容量工程里往往能优化掉不少扩容开销。这些都是阅卷时会看的东西。另一种高频题是“合并K个有序链表”。这道题考的是对优先队列堆的理解。K个链表、每个长度n如果每轮都遍历K个头节点找最小复杂度是O(K^2·n)而用堆可以把找最小这一步压到O(logK)整体就是O(K·n·logK)。B站实际业务中多路归并用在日志合并、推荐结果融合这些场景所以这个思路必须熟练到肌肉记忆。2.2 计算机网络TCP和HTTP是永远的主旋律B站笔试卷的计算机网络模块几乎绕不开TCP握手、拥塞控制、HTTPS握手过程。别觉得这些是八股文阅卷人其实是借此判断你有没有真正理解网络传输的原理。举一个高频题“为什么TCP建立连接需要三次握手而不是两次”这个问题看着简单但很多人答不到点子上。两次握手的核心问题是无法确认客户端的接收能力。如果只有SYN和SYNACK服务端无法知道客户端是否已经准备好接收数据一旦客户端最初的SYN报文在网络中滞留服务端重发了确认报文就会出现服务端以为连接建立了、客户端却已经放弃的情况产生资源浪费。三次握手里客户端收到服务端的SYNACK之后会回一个ACK这个ACK既确认了自己的发送能力也确认了接收能力问题就解决了。还有一类和B站业务直接相关的题HTTP和HTTPS的区别、HTTP/2多路复用、HTTP/3的QUIC协议。为什么B站会考这些因为视频网站对首包速度和弱网环境特别敏感。HTTP/2解决了队头阻塞但TCP层面的队头阻塞还在HTTP/3改用QUIC基于UDP实现了可靠传输把握手时间进一步压缩。你如果能把这一层演进逻辑讲清楚分数会明显比死记硬背的人高。2.3 数据库与Redis场景题的重点输出区域数据库这块B站笔试卷喜欢考索引、事务隔离级别、SQL优化和Redis缓存三大经典问题穿透、击穿、雪崩。这些不只是背概念要能结合具体场景说明方案选型的理由。MySQL索引为什么用B树而不是B树或哈希索引标准答案是哈希索引虽然单点查询O(1)但不支持范围查询和排序B树的非叶子节点也存数据导致树更矮但节点能存的数据条数变少检索时需要更多磁盘IOB树把所有数据都放在叶子节点通过双向链表串联既支持范围查询又因为非叶子节点只存索引键单层能容纳更多键值减少了磁盘IO次数。这套逻辑加上“磁盘预读”的原理才算把索引题答完整。Redis那块“缓存穿透”的常规解法是布隆过滤器缓存空值。但很多答案会忽略一个关键细节布隆过滤器只能判断“一定不存在”和“可能存在”它误判率不为0所以真正的生产环境还要配合“缓存空对象并设置较短过期时间”来兜底。我当时在项目里就是用Redis的setnx锁空值缓存双保险才把线下压测的穿透流量稳定下来。这类型题目你要是把这些工程细节写上去阅卷人是能看出来的。3. 编程题复现与解题思路现场手写代码的真实经验3.1 高概率压轴题手写LRU缓存淘汰算法LRULeast Recently Used缓存几乎是B站笔试编程题里出现概率最高的题目之一既能考察哈希表又能考察双向链表操作。由于LeetCode有原题146很多人会直接背答案但只要阅卷人稍微变换一下接口定义比如要求线程安全、要求支持过期时间就会刷掉一批死记硬背的。手写LRU的核心点用哈希表做到O(1)查找用双向链表维护访问顺序每次get命中时把节点移到链表头部每次put插入时如果容量已满淘汰链表尾部节点。Java里直接用LinkedHashMap可以秒解代码很短class LRUCache extends LinkedHashMapInteger, Integer { private final int capacity; public LRUCache(int capacity) { super(capacity, 0.75f, true); this.capacity capacity; } public int get(int key) { return super.getOrDefault(key, -1); } public void put(int key, int value) { super.put(key, value); } Override protected boolean removeEldestEntry(Map.EntryInteger, Integer eldest) { return size() capacity; } }但这里我要多说一句笔试时用LinkedHashMap没问题面试时最好还是能手写一遍双向链表。因为面试官想确认的不是你会不会调库而是你懂不懂它底层的数据结构。笔试时为了快速AC能用库就用库把注释和复杂度写在旁边反而能显得工程素养高。如果你又想秀一下可以先写一个Node内部类再维护head和tail伪节点最后再套HashMap这种写法也不难但需要多留10分钟调试时间别把自己逼得太紧。3.2 场景类编程题海量日志中找TopK还有一类题B站特别爱考从海量日志中统计访问次数最多的K个IP或者从大量评论中找热度最高的K条。这题考的是分治思想和小顶堆而不是全排序。思路是这样如果日志总量远超内存就不能一次性加载全部数据。常规做法是先用哈希取模做分片比如3个分片文件把相同IP散到同一分片然后每个分片内部用哈希表统计频次最后对每个分片的统计结果用容量为K的小顶堆维护当前TopK所有分片遍历完堆里的就是全局TopK。很多人会把最后一步写成“收集所有频次后排序”这在数据量大的时候非常尴尬。全排序O(NlogN)而维护K个元素的小顶堆是O(NlogK)当K远小于N时性能差距是数量级的。而且小顶堆的好处是空间占用只有O(K)完全可以在内存里玩得转。这类题写在代码里时一定要加上注释说明“为什么用小顶堆而不是大顶堆”——小顶堆堆顶是当前候选里最小的那个每来一个更大频次的新元素就替换掉堆顶并下沉最后剩下的K个就是最大的。想清楚这层代码就是直接套模板。3.3 除了正确性阅卷人还在看什么很多同学以为笔试卷子交上去系统跑一遍测试用例给个分就完了。实际上有经验的阅卷人看代码时会关注下面几点命名a、b、list1这种变量名在工程里是不可接受的至少要写成nodeIndexMap、pendingQueue这种一眼能看懂的名字。时间复杂度分析不要求你写注释但最好在关键函数上方用一行注释说明复杂度比如// O(n) time, O(k) space。空值和边界处理字符串长度为0、输入为null、链表只有一个节点、数据量大到溢出这些都是阅卷人重点看的地方。是否过度设计有些同学笔试题里写了几百行的工厂模式反而让阅卷人觉得你不懂取舍。校招笔试的核心是解决问题恰到好处的简洁比花哨的架构更重要。4. 面试官视角校招笔试卷的筛选陷阱与应试策略4.1 最常见的失分点不是不会是习惯不好我在帮朋友校招复盘时发现一个相当普遍的规律挂掉笔试的人往往不是完全不会做而是临场犯了低级错误。这里把高频失分点整理成一份自查表考前对照着过一遍比多刷十道题有用失分点典型表现对策int溢出用int存累加结果题目数据范围超过2^31-1看到数据范围先决定用long还是BigInteger输入输出格式错乱直接用IDE本地运行忘了OJ的输出格式多打印调试信息提前熟悉ACM模式交卷前检查输出内容死循环while循环里循环变量没更新边界值手动走一遍尤其链表和双指针数组越界处理二维矩阵时右下角访问出界提前判断行列边界宁多写if不少写条件审题不清题目要求输出索引而不是值要求升序而写成降序动笔前把题目读两遍圈出关键词时间分配失误在一道题上死磕1小时后面简单题没时间写先扫全部题目先易后难编程题每道不超过30分钟还有一个特别容易踩的坑B站的笔试题页面有时候会在代码编辑器里预置一部分代码比如已经帮你定义好了Solution类和方法签名。很多同学非要自己重写一个类导致编译不过。拿到题目先看预置代码按它的接口来写别自作主张。4.2 有效备战从刷题到模拟卷的节奏准备B站这类公司后端校招时间线大致可以这样规划。如果从现在开始算有三个阶段。第一个阶段是基础重建大约两周时间专门过计算机基础操作系统原理、TCP/IP详解、MySQL索引与事务、Redis核心数据结构。这个阶段不一定刷题但是要把“为什么”都搞懂。比如进程和线程的本质区别IO密集和CPU密集如何影响线程池大小这些基础不牢固后面做设计题就会发虚。第二个阶段是集中刷题大约四到六周。每天保持2到3道中等难度的LeetCode不要只刷自己擅长的类型把数组、链表、树、图、动态规划、贪心都轮着来。同时每周做一次套题模拟牛客网或者赛码网都有历年大厂笔试题限定一个半小时内完成然后对答案、复盘。这个阶段最容易发现的问题是“眼睛会了手不会”所以一定要动手写不要盯着题目看答案。第三个阶段是针对性强化大约一周时间。搜集B站近两三年的笔经面经把高频考点整理成自己的专题笔记比如“缓存三兄弟”“TopK全家桶”“HTTP演进史”。再配合一部分设计题训练拿“如何设计一个短链接系统”“如何设计秒杀系统”这类经典题目练手形成自己的回答框架。到了这一步笔试已经不是碰运气而是稳定输出。5. 常见疑问速查与实用建议5.1 关于笔试和招聘流程的高频问题校招期间经常有同学在群里问一些流程性、策略性的问题这里一并整理出来都是我平时答疑时反复说过的。B站笔试题可以用本地IDE吗 一般可以但很多在线笔试系统会要求前端开启摄像头监控和浏览器防切屏本地IDE能不能打开视具体平台而定。保险做法是提前在牛客网等平台熟悉它的在线编辑器降低对IDE的依赖。真的非要本地写就提前确认页面有没有“禁止跳出”规则。编程题可以选Python吗会不会比Java、Go吃亏 只要题目没有明确限定用什么语言都可以。Python在写算法题时效率高但如果你报的是Java后端建议优先用Java作答这样更容易展示你对语言特性和内存模型的理解。比如并发的题目用Java能顺手写线程池和锁用Python就少了很多可以展示的工程细节。笔试成绩多久出考砸了还能进面试吗 每个部门不一样有的笔试完一周内发面试邀约有的会拖到三周。笔试只是初筛如果简历经历很匹配、内推有加成即使笔试分一般也可能捞回来。所以投递时尽量找靠谱内推简历上多写和业务相关的项目笔试过程中也不能为了追求全对而丢掉编程题。系统设计题没有标准答案怎么保证不跑偏 记住一个原则设计题考察的是“分析和权衡”的能力。先明确功能和性能目标再画出大致模块和请求流程然后突出重点哪里可能成为瓶颈用什么方案去解决还有哪些备选方案最后说清楚为什么选择这个方案。即使答得不够完美只要逻辑自洽分数就不会低。5.2 笔试之后的下一步复盘比结果更重要笔试结束别急着对完答案就放下建议花半小时做一个结构化复盘。把你做错的题、蒙对的题、超时的题分门别类记录下来每一道题都标注出考察的知识点然后回看一遍真题解析。我见过有的同学一战挂了B站笔试但是他把每道题都吃透了后来面别的公司时遇到类似题型直接秒杀掉并拿到offer。笔试的逻辑是相通的A厂考过的算法B厂很可能换个壳继续考。不要因为一家失利就否定自己把那套卷子变成自己的题库反而是最赚的。另外笔试通过之后到面试之间通常有几天到一周的间隔这段时间别躺在原地。把项目经历重新梳理一遍尤其是用到了Redis、消息队列、MySQL的模块准备好每个技术选型的理由和关键数据。B站面试官特别喜欢追问项目里的技术细节比如“为什么这里的缓存设置过期时间为30分钟而不是5分钟”“这个消息队列如果挂了怎么兜底”这些问题的素材都来自你做过的项目。笔试只是个开始后面考察的深度和颗粒度会越来越大。最后再分享一个小技巧笔试前尽量把电脑电源插上网络切到有线或信号好的热点找一个安静没人打扰的房间。这些看似无关的细节往往决定了你的做题状态。如果你能稳定输出把该拿的分拿全B站的后端offer大概率不会绕着你走。
返回列表