B站2020校招后端笔试卷解析:考点、难度与避坑策略
2026/9/1 21:28:43 网站建设 项目流程

看到“哔哩哔哩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) { Map<Character, 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和SYN+ACK,服务端无法知道客户端是否已经准备好接收数据,一旦客户端最初的SYN报文在网络中滞留,服务端重发了确认报文,就会出现服务端以为连接建立了、客户端却已经放弃的情况,产生资源浪费。三次握手里,客户端收到服务端的SYN+ACK之后,会回一个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树的非叶子节点也存数据,导致树更矮但节点能存的数据条数变少,检索时需要更多磁盘IO;B+树把所有数据都放在叶子节点,通过双向链表串联,既支持范围查询,又因为非叶子节点只存索引键,单层能容纳更多键值,减少了磁盘IO次数。这套逻辑加上“磁盘预读”的原理,才算把索引题答完整。

Redis那块,“缓存穿透”的常规解法是布隆过滤器+缓存空值。但很多答案会忽略一个关键细节:布隆过滤器只能判断“一定不存在”和“可能存在”,它误判率不为0,所以真正的生产环境还要配合“缓存空对象并设置较短过期时间”来兜底。我当时在项目里就是用Redis的setnx锁+空值缓存双保险,才把线下压测的穿透流量稳定下来。这类型题目你要是把这些工程细节写上去,阅卷人是能看出来的。

3. 编程题复现与解题思路:现场手写代码的真实经验

3.1 高概率压轴题:手写LRU缓存淘汰算法

LRU(Least Recently Used)缓存几乎是B站笔试编程题里出现概率最高的题目之一,既能考察哈希表,又能考察双向链表操作。由于LeetCode有原题146,很多人会直接背答案,但只要阅卷人稍微变换一下接口定义,比如要求线程安全、要求支持过期时间,就会刷掉一批死记硬背的。

手写LRU的核心点:用哈希表做到O(1)查找,用双向链表维护访问顺序,每次get命中时把节点移到链表头部,每次put插入时如果容量已满,淘汰链表尾部节点。Java里直接用LinkedHashMap可以秒解,代码很短:

class LRUCache extends LinkedHashMap<Integer, 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.Entry<Integer, 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 除了正确性,阅卷人还在看什么

很多同学以为笔试卷子交上去,系统跑一遍测试用例给个分就完了。实际上,有经验的阅卷人看代码时会关注下面几点:

  • 命名:ablist1这种变量名在工程里是不可接受的,至少要写成nodeIndexMappendingQueue这种一眼能看懂的名字。
  • 时间复杂度分析:不要求你写注释,但最好在关键函数上方用一行注释说明复杂度,比如// 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大概率不会绕着你走。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询