B站2020校招后端笔试卷复盘:核心考点与解题思路
2026/8/31 4:26:29 网站建设 项目流程

拿到这套“哔哩哔哩2020校园招聘后端笔试卷(二)”,我先翻了整张卷子,没有急着刷题,而是先琢磨B站到底想通过这些题筛选什么样的人。2020年的校招笔试题放到现在来看,技术考点可能有些迭代,但考察的底层逻辑没有变——基础扎不扎实、工程思维有没有、遇到没见过的问题能不能拆解。这套卷子恰好是一份很好的“后端能力体检单”,不止适用于投B站,准备其他互联网公司校招后端岗也可以拿它做参照。

这篇内容我打算按自己复盘一套笔试卷的方式展开:先聊这套题背后反映的考察范围,再结合常见的后端技术栈梳理复习优先级,接着拆解几类典型题型的解题思路,最后聊聊笔试现场的时间分配和翻车经验。如果你正在准备校招后端岗位,或者刚入行想看看大厂笔试到底考什么,这篇内容应该能帮你少走一些弯路。

1. 这套笔试卷的考察边界:从B站后端技术栈反推命题意图

1.1 B站这类内容平台的后端体系决定了笔试要考什么

B站的核心业务是什么?视频、弹幕、评论、私信、推荐、直播、社区运营。这决定了它的后端技术体系不是单一的CRUD应用,而是一个包含接入层、业务层、存储层、消息队列、缓存、搜索推荐、大数据处理的复杂系统。

视频业务涉及上传、转码、分发、CDN调度;弹幕和评论是典型的低延迟读写场景;推荐系统依赖海量用户行为数据的实时处理;直播业务对链路延迟极其敏感。这些业务形态直接决定了笔试的考察范围——凡是支撑这些业务的基础技术,都会出现在卷面上。

所以你会看到后端笔试试卷几乎绕不开这四块:计算机网络、操作系统、数据库、数据结构与算法。这四块不是孤立的,而是对应了后端工程师日常工作的底层支撑。比如网络协议对应接口设计和RPC调用,操作系统对应并发编程和性能调优,数据库对应数据建模和查询优化,算法则对应复杂业务逻辑的抽象能力。

1.2 试卷(二)的题型结构与难度分布推断

B站校招后端笔试卷一般分为客观题、编程题和简答题几个模块。客观题考察知识面覆盖度和概念的准确性,编程题考察代码实现能力和算法功底,简答题则侧重系统设计思路和问题分析能力。

从“二”这个编号推断,这是系列试卷中的一套,大概率和其他套卷在考点覆盖上互有交错。遇到这种批次的卷子,考察重点往往集中在几类高频考点上:TCP/UDP协议特性、HTTP请求过程、进程与线程的区别、锁机制、索引优化、缓存穿透与击穿、常见排序算法、动态规划与图论基础题等。

难度分布上,一般遵循“基础题拿分、中等题拉差距、难题做区分”的原则。前几道客观题通常比较直接,只要基础概念扎实就能答对;编程题里会有一两道经典题型(比如最长公共子序列、两数之和变体、链表操作);压轴题往往以某个业务场景为背景,要求你设计一个方案或者回答一个开放性问题。

1.3 为什么计算机网络是必考中的必考

几乎所有后端笔试卷都会重点考察网络知识,B站这套也不会例外。原因很简单:后端开发本质上是处理请求和响应,而请求和响应在网络中的传输过程决定了很多技术方案的选型。

以B站为例,用户从点击视频到播放器开始播放,中间涉及DNS解析、建立HTTP连接、可能经过CDN节点、请求到达后端服务、后端查缓存或数据库、返回视频播放地址、前端再发起流媒体请求。这一条链路全程都是网络知识。笔试考三次握手四次挥手、HTTP状态码、HTTPS加密过程,就是在考察你是否能理解这条链路。

备考建议是不要死记硬背,而是把问题放在具体场景里去理解。比如面到TCP为什么需要三次握手,不要只背“防止已失效的连接请求报文突然又传到服务端”,而是想一想:如果只有两次握手会发生什么?如果客户端第一个SYN报文在网络中滞留,服务端收到了重发的SYN并建立连接,但滞留的SYN又到达了,服务端会再次建立连接,客户端却以为这个连接不存在,就会造成资源浪费。三次握手通过客户端的第三次ACK来确认“客户端确实想建立连接”,这才彻底解决了这个问题。

2. 从热搜词提炼的复习优先级:Java、Spring、前后端分离与数据库

2.1 Java还是后端笔试的主流选项,但语言只是载体

从技术栈热度来看,Java仍然是校招后端笔试中最常见的语言选项。B站后端早期以Java为主,后续引入了Go、Python等语言,但笔试环节通常会允许考生自选语言完成编程题,或者以Java为默认语言出题。

我经常看到有人纠结笔试到底用哪种语言,其实方向搞偏了。笔试考察的是“解决问题的能力”,语言只是工具。你用Java写出的快排和用Python写出的快排,在核心逻辑上没有任何区别,关键是你能否:

  • 写出边界条件正确的代码
  • 准确分析时间复杂度和空间复杂度
  • 在限定时间内完成调试

如果你用Java,那Java基础是必须过一遍的。比较典型的考点包括:HashMap的底层实现原理(数组+链表+红黑树)、ArrayList和LinkedList的区别、线程池的核心参数、volatile和synchronized的区别、Java内存模型、类加载过程、JVM垃圾回收算法与收集器。这些内容不背不行,但光背也不行。拿HashMap的put流程来说,完整回答需要讲到:计算key的hash值、通过扰动函数降低碰撞概率、定位到数组索引位置、判断当前位置是否为空、不为空则遍历链表或红黑树查找相同key、存在则覆盖返回旧值、不存在则新增节点、如果链表长度达到8且数组长度达到64则树化。你能顺着这个流程把每一步的原理都讲清楚,才算真正掌握,而不是背了个概念。

2.2 前后端分离与接口设计在后端笔试中的呈现方式

热搜词里反复出现“前后端分离项目实战”“java前后端工作原理”,对应的是后端笔试中的工程实践类考点。前后端分离已经是当前Web开发的标配架构,后端笔试不会直接让你写一个完整项目,但会在简答题或场景题中间接考察。

核心考点有两个方向:一是接口设计规范,二是跨域问题处理

接口设计方面,RESTful API风格是考察重点。比如一个获取视频信息的接口,你应该设计成GET /api/v1/videos/{videoId},而不是POST /api/getVideoInfo。动词交给HTTP方法,资源用名词复数表达,状态码语义正确——200表示成功、400表示请求参数错误、401表示未认证、403表示无权限、404表示资源不存在、500表示服务端异常。

跨域问题方面,笔试大概率会问:为什么浏览器要限制跨域请求?如何解决跨域?这就涉及到同源策略、CORS、代理转发、JSONP(现在用得少了)等概念。CORS的核心是服务端在响应头里带上Access-Control-Allow-Origin,浏览器根据这个头决定是否放行响应。实际项目中,后端还要处理预检请求(OPTIONS请求),配置允许的HTTP方法、允许的请求头等。

Token认证也是高频考点。前后端分离后,Session的维护方式变了,JWT(JSON Web Token)成了常见方案。你需要明白JWT的三段结构(Header.Payload.Signature)、无状态认证的原理、以及它的缺陷(无法服务端主动失效、payload不能放敏感信息)。这些考点看起来是“前后端分离相关”,实际上考察的还是HTTP协议和Web安全的基础。

2.3 数据库与缓存的考察粒度

数据库是后端笔试分值占比较高的一部分,通常涉及MySQL和Redis两种组件。

MySQL的高频考点集中在索引、事务和锁。索引部分,你需要理解InnoDB的B+树索引结构、聚簇索引与二级索引的区别、最左前缀原则、索引失效的典型场景(对索引列使用函数、隐式类型转换、like以通配符开头等)、覆盖索引与回表。事务方面,需要掌握ACID的定义、四种隔离级别(读未提交、读已提交、可重复读、串行化)、脏读/不可重复读/幻读分别对应哪种隔离级别的缺陷、MVCC多版本并发控制的实现机制。锁方面,行锁、表锁、间隙锁、死锁的产生条件和解决方案。

Redis的考点相对集中:Redis为什么快(纯内存操作、单线程避免锁竞争、IO多路复用)、持久化机制(RDB和AOF的区别与适用场景)、过期删除策略(惰性删除+定期删除)、内存淘汰策略(noeviction、allkeys-lru、volatile-lru等)、缓存穿透/击穿/雪崩的区别与解决方案。

这些考点在笔试中通常以两种形式出现:一种是选择题,让你判断某个说法是否正确;另一种是场景题,比如“一个视频的播放量每天有几千万次更新,你怎么设计存储方案”。做好这种题,光靠背概念是不够的,你需要把概念串联成方案。

3. 校招后端笔试的三类必考题型与解题思路复盘

3.1 算法题:不只要求AC,还要讲清楚复杂度

算法题是笔试试卷里拉开差距的核心模块。B站校招笔试的算法题难度大概在LeetCode Medium上限附近,偶尔会出现一道Hard级别的思维题。但比起刷题数量,我觉得更重要的是掌握一套稳定的解题框架。

我的习惯是拿到一道算法题按三步走:

第一步,先看数据范围。数据量是10^5还是10^3,直接决定了算法选型。如果n <= 10^5,O(n^2)的算法大概率超时,需要考虑O(n log n)或O(n)的解法;如果n <= 10^3,O(n^2)可能刚好卡线,但O(n^3)肯定不行。这个判断必须在动笔前完成。

第二步,暴力求解建立基准。遇到没见过的题,先不要直接套所谓“最优解”,而是想清楚暴力解怎么写。暴力解的价值在于让你理解问题的原始结构,再在这个基础上做优化。比如求一个数组中和为target的两数下标,暴力解是两层循环;优化时发现内层循环可以用哈希表替代,时间复杂度从O(n^2)降到O(n)。

第三步,识别题型特征。看到“连续子数组”“最长”“最短”“窗口”等字眼,优先考虑滑动窗口;看到“最值”“方案数”“状态转移”优先考虑动态规划;看到“连通性”“最短路径”优先考虑BFS/DFS;看到“第K大/小”优先考虑堆或快选。

以2020年前后校招笔试常考的最长无重复字符子串为例:暴力解法是枚举所有子串,再用Set判断是否包含重复字符,时间复杂度O(n^2);优化方向是滑动窗口,窗口内用HashMap记录每个字符最近出现的位置,每次移动右指针扩展窗口,如果发现窗口内有重复字符,就把左指针跳到重复字符上次出现位置的下一个位置。这样每个字符最多被访问两次,时间复杂度O(n)。

还有一个容易被忽略的点——笔试做题不要只写核心逻辑,要写完整个方法签名和边界处理。比如输入为空数组处理、单个元素处理、结果应该是int还是long、溢出问题。很多同学题解思路是对的,但边界条件没处理全,最后只过了一部分测试用例。

3.2 网络与操作系统的底层原理问答方式

网络和操作系统通常以简答题或选择题的形式出现,偶尔会结合场景做变体。

网络知识的典型考察方式是这样的三道题:

第一道:为什么TCP建立连接需要三次握手,而断开连接需要四次挥手?这个问题的完整答案涉及两个点——三次握手的原因是“双方都需要确认自己和对方的收发能力正常”,四次挥手的原因是“TCP是全双工的,每个方向的连接必须独立关闭”。断开连接时,主动关闭方发送FIN表示“我这边没有数据要发了”,被动关闭方可以先回ACK表示“我收到了你的FIN”,但此时被动关闭方可能还有数据要发,所以不能立刻也回FIN,必须等自己的数据发完后再发FIN。这中间就多了一次交互,所以是四次。

第二道:HTTPS建立连接的过程是什么?完整链路是:客户端发起ClientHello,服务端返回ServerHello、证书、密钥交换参数,客户端验证证书合法性,双方协商出预主密钥,再用预主密钥生成会话密钥,之后通过会话密钥进行对称加密通信。中间涉及的RSA或ECDHE密钥交换算法、证书链验证、数字签名等细节,笔试如果问得深,需要有逻辑地表述出来。

第三道:HTTP/1.1和HTTP/2的主要区别是什么?多路复用、头部压缩、二进制分帧、服务端推送。每个点都应该能展开说明,比如多路复用解决了HTTP/1.1队头阻塞的问题,允许同一个连接上同时处理多个请求,每个请求对应一个stream,互不阻塞。

操作系统的高频考点是进程与线程、并发锁、IO模型。

进程与线程的核心区别是“进程是资源分配的最小单位,线程是CPU调度的最小单位”,但这样答只能拿基础分,想拿高分需要补充:进程之间内存空间相互隔离,线程共享进程的内存空间,所以线程切换成本低于进程切换,但也正因共享内存,线程安全问题才需要加锁解决。

IO模型方面,要理清阻塞IO、非阻塞IO、IO多路复用、异步IO的区别。一个套用在后端场景里的经典题目:一个服务端进程如何同时处理上万个客户端连接?答案是IO多路复用,select/poll/epoll,其中epoll通过事件驱动机制,只返回有事件发生的文件描述符,时间复杂度O(1),是支撑高并发的最核心机制。这道题经常和“C10K问题”一起考,是后端笔试的常青树。

3.3 系统设计题:以B站业务场景为例的答题框架

系统设计题是校招笔试中最容易让人慌的题型,因为看起来开放度太大,不知道从哪下手。但如果掌握了一个稳定的答题框架,这类题反而是最容易拿分的地方。

我的框架是四步走:需求分析 → 容量估算 → 架构设计 → 关键细节

以一道典型的B站风格设计题为例:请设计一个弹幕系统,支持大量用户同时发送和查看弹幕。

需求分析阶段,要明确功能需求和非功能需求。功能需求包括发送弹幕、按视频加载弹幕、弹幕实时显示;非功能需求包括低延迟(弹幕延迟在秒级以内)、高并发(热门视频可能同时有数万人在线)、高可用。

容量估算阶段,不需要算得很精确,但要有一个量级判断。假设一个热门视频同时在线人数有10万,每个用户每10秒发一条弹幕,平均每秒就有1万条弹幕消息。这个量级下,直连数据库的写入模式肯定扛不住,需要引入消息队列削峰。

架构设计阶段,可以画一条链路:客户端 → 接入层(WebSocket长连接或HTTP轮询)→ 弹幕服务 → 消息队列 → 存储层。实时弹幕通过消息队列推送给订阅了该视频弹幕频道的在线客户端,历史弹幕从存储层加载。

关键细节阶段,要考虑热点问题。弹幕最怕某个视频突然爆火,大量用户同时涌入,直接打到数据库。所以需要本地缓存+分布式缓存分层,缓存最近几分钟的弹幕数据,历史数据从数据库读取;写入端也要做限流和削峰,防止瞬时流量打挂服务。弹幕内容还要做敏感词过滤,热门主播直播间里刷屏逻辑不同,可能需要更细粒度的分片方案。

有了这套框架,就算你不能在笔试时间限制内把每个细节都考虑周全,也能向阅卷人展示出“我是有系统设计思维的人”。这个能力,远比背几个零散的知识点重要。

4. 校招笔试中高发翻车点的实测复盘

4.1 最容易被扣分的隐性扣分点

结合我接触过的笔试题目和同学反馈,有四个隐性扣分点最容易被忽略。

第一个是复杂度分析缺失。编程题写完代码后,我会习惯性地在旁边写一行注释,标注时间复杂度O(n)、空间复杂度O(1)。很多笔试题明确要求写出复杂度分析,即使没有明确要求,也是加分项。这不仅仅是形式问题,它反映出你是否真的理解自己写的代码。

第二个是客观题的“想当然”。举个典型例子:问“TCP的握手过程中,第三次握手可以携带数据吗?”基础扎实的同学知道可以,因为第三次握手时客户端已经确认了服务端的接收能力和自己的发送能力,可以带着数据一起发送。但很多人背过“三次握手连接建立后才能发送数据”,就把这个对的选项排除了。这种题考的不是记忆,而是对机制的深入理解。

第三个是省掉边界处理。写快排只写主流程,忘了处理数组为空的边界;写二分查找,不处理left > right的终止条件;写状态转移,数组下标直接越界。这些问题在本地IDE里可能不会被测试用例覆盖,但笔试系统的用例往往专门设计边界场景来测试。

第四个是概念含糊不清。比如“进程和线程的区别”,很多同学答“进程是正在运行的程序,线程是轻量级进程”,这种回答等于没答。面试官想听的是“进程是操作系统分配资源的基本单位,线程是CPU调度的基本单位,同一个进程内的多个线程共享进程的地址空间和资源,线程切换的上下文开销更小”。用准确的定义和可对比的描述,才能拿满这道题的分数。

4.2 时间分配策略:从“能做对”到“做完”

笔试题量大、时间紧,时间分配不合理往往导致后面的大题没时间写。我自己的策略是“先拿下确定性高的分数,再啃硬骨头”,一般按这个顺序推进:

  • 热身阶段(前10分钟):把整张卷子快速浏览一遍,标记出哪些题是秒答的,哪些题需要思考。不要上来就闷头做题,这道题看看那道题想想,最后容易哪道都没做完。
  • 优先阶段:把一眼就知道答案的客观题全部做完。这些题不需要太多思考,花的时间越少,给后面编程题留的时间越多。
  • 攻坚阶段:主攻编程题,先挑自己最有把握的那道开始写。编程题宁可多写,不要少写,把解题思路拆成步骤和注释写在代码里。
  • 收尾阶段:剩下时间处理那些较难的选择题或简答题,每一道都尽量写点东西上去,哪怕只写一部分思路,也比空着强。

编程题如果卡住超过20分钟,我的做法是立即停下来,换一道题做,回头有时间再继续。考试最忌讳的是一道题卡了1小时,后面的题目一个字没动,心态也炸了。

4.3 不会做的题应该怎么处理

每个人都会遇到完全没思路的题,关键是怎么处理。

我的经验是:不要直接放弃,而是拆解到最小步骤。比如一道图论的题完全没思路,但你至少能写出来“读入N个顶点和M条边”“用邻接表建图”“初始化visited数组”这前三步。这三步虽然还没触及核心算法,但至少能拿一部分测试用例的分数,也能让阅卷人看到你的基础代码能力是有的。

简答题遇到不会的,就写关联知识。比如问“Redis为什么这么快”,如果你记不全所有原因,就把你能想起来的都写上去:基于内存、单线程模型减少锁竞争、IO多路复用、高效的数据结构设计。即使答得不完整,也比空着强。

笔试用的在线编译器通常没有自动补全,平时刷题如果依赖IDE的代码提示,考前一定要用白板或者无补全环境练几道题,否则考试时会非常不适应。平时可以在LeetCode上用英文版无提示模式刷题,或者直接在记事本文档里写代码,再拷到编译器里运行。

5. 笔试之外的延续准备:从卷面到面试

5.1 笔试题背后的追问方向

笔试考完往往还有更重要的环节——面试。大多数同学以为笔试题交上去就翻篇了,其实面试官可能拿着你的笔试答案接着深挖。

三道常见追问方向:

  • 笔试中你用了HashMap优化算法,面试官可能会追问:HashMap的扩容机制是怎样的?为什么Java 8之后要把链表转化为红黑树?为什么阈值是8?
  • 笔试中你提到了“缓存穿透”的解决思路,面试官可能会追问:布隆过滤器会误判吗?误判率怎么控制?Bloom Filter的二进制数组空间怎么预估?
  • 笔试中你设计了一个高并发接口,面试官可能会追问:接口的限流用的是什么方案?你考虑过多个实例部署时的限流一致性问题吗?

所以笔试刷题的时候不要只满足于“AC了”,每一道题做完,先想想:这道题对应的核心知识点是什么?面试官可能围绕这个知识点追问我什么?提前做好预案,笔试结束后的面试就不慌。

5.2 项目从“能跑”到“能讲”的三层准备

后端校招笔试通过后,面试环节最常被考察的是项目和实习经历。很多同学简历里写“熟练使用Spring Boot + Vue开发前后端分离项目”,但面试官一问细节就露馅。把项目准备好,其实也分三个层次。

第一层是功能层面:你做的项目有哪些功能模块,核心业务逻辑是什么。这个层次只需要对项目有基本了解,代码是靠自己写的,能说清楚。

第二层是技术选型层面:为什么用Redis缓存,为什么用RabbitMQ而不是Kafka,为什么数据库表要冗余这个字段。这个层次考察的是技术决策能力,面试官想听的不是“因为大家都在用”,而是你基于业务场景做的取舍。

第三层是深度优化层面:项目中遇到的最大瓶颈是什么,怎么定位的,怎么解决的,有没有量化的数据。比如你的接口原来响应时间200ms,优化后降低到50ms,优化方案是什么?是加了索引、改了SQL、加了Redis缓存、还是准并发处理?这个层次最能让面试官对你有正向印象,但也是准备起来最难的部分。

如果简历里写了“前后端分离项目”,那一定要准备一个从端到端的完整交互链路描述:用户输入URL → DNS解析 → 请求到达Nginx → Nginx反向代理到后端服务 → Spring Boot接收请求 → 拦截器认证 → Controller层参数校验 → Service层业务处理 → Mapper层查询/写MySQL → Redis缓存更新 → 返回JSON → 前端Ajax接收并渲染。把这条链路讲顺了,前后端分离的原理题至少能答到70分。

5.3 一个实用技巧:用复盘表整理笔试错题

笔试阶段最容易犯的错是“为了刷题而刷题”。刷了几百道LeetCode,但真的在笔试时遇到变体还是做不出来,本质上是因为没有把题目归类到知识体系里。

我建议整理一份简单的复盘表,每遇到一道错题就记录四个字段:考点分类、错误原因、正确思路、关联知识点。

举个例子:

  • 考点分类:动态规划-子序列问题
  • 错误原因:没有建立状态转移方程时先考虑“当前字符是否匹配”
  • 正确思路:dp[i][j]表示text1前i个字符与text2前j个字符的最长公共子序列长度,分两种情况讨论
  • 关联知识点:LCS问题的状态转移模板、滚动数组空间优化
  • 复盘时间:一周后重新做一遍

坚持两周,就能直观看到自己在哪些考点上反复出错,哪些考点已经形成了肌肉记忆。比如我当年复盘发现自己的薄弱项是“位运算”和“字符串处理”,就去集中刷了几十道对应的题目,效果比盲目刷题好得多。这个习惯对后续找实习、参加秋招都有长期价值,不只针对一套笔试卷。

校招笔试是场持久战,没有一蹴而就的捷径,但也没有想象中那么高不可攀。把基础概念吃透、把经典题型练熟、把常见场景想清楚,这套“哔哩哔哩2020校园招聘后端笔试卷(二)”反映出来的考察逻辑,本质上也就是这些。我自己当年准备笔试时,最深的体会是:不要怕题难,要怕的是自己明明知道知识点,却在考场上因为表达不清、边界没考虑、时间没分配好而丢了分。把每一次练习都当成正式考试来对待,真正坐到考场里的时候,反而会轻松很多。

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

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

立即咨询