B站2020校招算法笔试卷全解析:从KMP到Transformer的高频考点与备考策略
最近有朋友把“哔哩哔哩2020校园招聘算法笔试卷一”发给我问我这套卷子值不值得认真刷一遍。我的看法是它不只是B站一家的校招题而是近年来互联网公司算法岗笔试题的一个典型缩影。这套卷子涵盖了基础算法、数据结构、机器学习理论和手写代码几大块对准备算法岗、机器学习岗、推荐系统岗的同学都有很强的参考意义。我从头到尾做了一遍也拿给身边的候选人练过手今天就借这套卷子把高频考点和应对思路完整拆一遍顺便把容易栽跟头的地方都指出来。1. 试卷整体框架与核心考察方向1.1 从试卷结构看考查范围通常校招算法笔试卷会分成客观题和编程题两大部分。客观题包括单选题、多选题、填空题和简答题编程题一到三道不等整套卷子的考试时间一般在60分钟到120分钟之间。B站这套2020年的卷子也是这个路子知识点分布相当集中大致可以归成几类基础数据结构数组、链表、栈、队列、二叉树、堆、并查集、图经典算法排序、二分、贪心、动态规划、字符串匹配数学与概率排列组合、期望、概率计算、快速幂、素数判断机器学习与深度学习模型原理、损失函数、优化器、评价指标编程题一般2到3道重点考动态规划、二分、图遍历、贪心策略从题量配比来看这份卷子比较看重候选人的算法基本功和模型理解深度。尤其是B站的业务里面视频推荐、内容分发、用户增长、弹幕分析这些方向都离不开机器学习所以题里出现概率统计和ML/DL的内容一点不意外。很多只刷力扣的候选人在这里容易吃亏因为力扣主要锻炼的是算法题手感和代码能力对理论知识的覆盖并不系统。1.2 校招算法卷的出题意图拆解笔试不是纯粹考“你会不会写代码”而是在有限时间里看你的思维方式、代码习惯、边界处理能力和知识迁移能力。我见过不少人选择题全部做完编程题却直接交白卷也有候选人编程题拿了满分但简答题连SVM的核函数都说不清楚。这两种情况都很可惜本质上是刷题方向偏了。B站这套卷子给我的整体感觉是它把基础算法当成必备项把机器学习理论当成区分项编程题则是最后的落地考察。说直白一点这卷子筛的不是“背过多少题”而是“遇到新题能不能拆解、能不能用代码把思路表达出来、能不能在压力下保持逻辑清晰”。这也是我建议准备算法岗的同学在刷题之外一定要补一轮理论基础的原因。想靠题海战术蒙混过关应付一般小厂可能够了面对这种级别的卷子基本没戏。1.3 适合什么人重点研究如果你是准备一线大厂算法岗、机器学习岗的应届生这套卷子的考点基本可以当作自测清单。如果你是准备推荐系统、搜索、内容理解方向的同学里面机器学习和概率题的价值会更高。如果你只是刚开始入门算法也不用被整套卷子吓到可以先挑基础算法部分做把高频题型吃透再逐步扩展。我建议拿到这套卷子之后别急着整套做先计时做一遍看看自己卡在哪类题上。如果卡在选择题里的概率题说明数学基础需要补如果卡在编程题说明代码手感不够如果卡在机器学习简答题说明理论框架没建立。分清楚薄弱环节再做针对性训练比盲目重复刷题有效得多。2. 基础算法考点解析重点难点拆解2.1 KMP算法与next数组的现场推导KMP是字符串匹配里出现频率非常高的考点B站这套卷子以及很多大厂校招都考过。KMP的核心不是匹配过程本身而是next数组怎么求、为什么这样求。很多人背了代码但一被追问就露馅就是没搞懂next数组的本质。网上对于“在KMP算法中对于模式串pabacaba其next数组怎么求”的讨论一直很热这类问题我建议不要背答案而是会手推。next数组的定义有两种版本一种是next[i]表示模式串前i个字符组成的子串的最长相等前后缀长度另一种是失配后跳转的位置。不同教材定义不一样做题之前先看题目给的是哪一种不然求出来的数组对不上号。以模式串abacaba为例我完整手推一遍。长度为1的前缀a没有真前后缀最长相等前后缀为0。长度为2的前缀ab前缀a和后缀b不相等最长相等前后缀为0。长度为3的前缀aba前缀a等于后缀a再看两位前缀ab和后缀ba不相等所以最长相等前后缀为1。长度为4的前缀abac逐个比较发现没有相等的前后缀结果为0。长度为5的前缀abaca前缀a等于后缀a结果为1。长度为6的前缀abacab前缀ab等于后缀ab结果为2。长度为7的前缀abacaba前缀aba等于后缀aba结果为3。所以如果题目要的是最长相等前后缀数组结果就是[0,0,1,0,1,2,3]如果要的是失配跳转数组通常是把每个值往前平移一位并做修正常见结果是[-1,0,0,1,0,1,2]。很多人在这一步卡住其实不是不会算前缀和后缀而是没搞清楚题目要的是哪个定义。现场写KMP代码的时候我习惯把求next和匹配分开写每个函数只做一件事。求next的过程本质上是模式串自己和自己匹配i走在后面j记录已匹配的前缀长度。这里有一个典型的坑当j大于0且当前字符不等时要回退到next[j]而不是简单地把j减1这个“回退到之前回退过的地方”的递归逻辑想不清楚的话数组推两行就乱了。KMP算法的关键在于它利用了模式串自身的重复结构避免主串指针回溯。这一点在笔试里如果被问到“为什么KMP比暴力匹配快”你要能回答暴力匹配在最坏情况下每次匹配失败主串指针都要回退而KMP通过next数组让模式串向右滑动尽可能远的距离主串指针不回溯整体时间复杂度是O(mn)。m是模式串长度n是主串长度。2.2 排序算法对比与复杂度边界排序算法几乎是必考题但很多人只会背时间复杂度和稳定性结论一被追问就露馅。比如快速排序为什么最坏是O(n^2)、平均是O(n log n)原因很简单每次partition如果选到极值作为基准比如数组本来就有序且每次选第一个元素做基准那么每次只能分出一个元素递归树高度变成n每层还是要扫描n个元素总复杂度就退化成O(n^2)而期望情况下基准落在中间附近递归树高度是log n每层扫描n个元素总复杂度就是O(n log n)。堆排序为什么是稳定的O(n log n)因为建堆过程是O(n)每次从堆顶取出最大元素后调整堆是O(log n)一共取n次所以整体是O(n log n)。归并排序为什么稳定因为合并两个有序子数组时如果左右两边元素相等我们先取左边的元素这样就保持了原有的相对顺序。快排为什么不稳定因为partition过程中元素会按基准值进行远距离交换相等的元素可能被交换到彼此的另一侧相对顺序就变了。还有一个容易被忽略的点稳定性在工程里到底有什么意义。一个典型场景是先按时间排序再按优先级排序如果是稳定排序时间相同的数据会保持原有的相对顺序最终结果就能做到“优先级相同的情况下按时间升序”。Java的Collections.sort对对象数组使用TimSort也就是归并排序的优化版而对基本类型数组使用双轴快速排序为什么这么设计因为基本类型排序不需要稳定性而对象排序往往需要保留相等元素的原始顺序这背后就是稳定性的工程价值。实际笔试中如果遇到排序题不要上来就写快排先看题目场景。数据量小且基本有序插入排序可能更快因为它的最好复杂度是O(n)而快排在这种场景下表现反而不稳定。数据规模大且要求稳定归并排序更合适代价是需要O(n)的额外空间。要求原地排序且不要求稳定堆排序或者快排更合适。如果要求最坏情况也有保证堆排序是安全选择。这些选择逻辑比单纯背诵复杂度结论重要得多因为面试官真正想听的是你懂不懂排序算法在不同场景下的取舍。2.3 贪心、动态规划与启发式搜索贪心和动态规划的区分也是高频题点。贪心是每一步做局部最优选择且不回溯动态规划是枚举所有状态记录子问题结果。做题的时候先判断有没有最优子结构和重叠子问题有重叠子问题就优先想DP没有就考虑贪心。举个例子找零问题里如果用无限量的1元、5元、11元硬币凑出15元贪心会选11111一共4枚但最优解是555一共3枚。这种情况下贪心失效因为局部最优不等于全局最优。而经典的“活动选择问题”里每次选结束时间最早的活动就是贪心最优解因为这个问题满足贪心选择性质。能把这两类问题的差异讲清楚比做一百道题更能体现算法思维。热词里提到的模拟退火算法和粒子群算法在校招笔试中更多以选择题或简答题形式出现很少要求你手写完整实现。模拟退火的核心是Metropolis准则温度高的时候接受较差解的概率大温度低的时候概率小这样设计是为了跳出局部最优避免优化过程一开始就陷在某个局部极值里。我再补充一句模拟退火名字里的“退火”来自冶金工艺金属加热后缓慢冷却原子能进入能量更低的状态算法借用了这个思路。粒子群算法是受鸟群觅食启发的群体智能算法。每个粒子代表解空间里的一个候选解粒子根据自身历史最优位置和群体历史最优位置更新速度与位置。速度更新公式里有两个权重一个是“自我认知”部分让粒子往自己经历过的最优位置飞另一个是“社会认知”部分让粒子往整个群体发现的最优位置飞。这种算法在连续优化问题里表现不错但校招不会考太深你只要能说清它的核心思想和与梯度下降的区别就够了。这类启发式算法和梯度下降最大的区别在于梯度下降依赖损失函数的梯度信息对可导函数有效启发式算法不依赖梯度只需要能计算目标函数值所以对不可导、离散、非凸的复杂问题也能处理。代价是收敛速度慢、结果不稳定通常只能找到近似最优解。能理解这层差异笔试里的理论选择题基本就难不倒你了。3. 机器学习与深度学习高频考点3.1 经典模型LR、SVM、决策树的底层逻辑B站的业务里内容理解、用户行为预测、推荐排序都是机器学习的主战场所以这套卷子在机器学习上考得不浅。我批改过不少校招笔试卷发现大部分人在编程题上差距不大真正拉开分数的是机器学习简答题和推导题。逻辑回归LR是必考的。你要能写出它的损失函数L -1/N * sum [ y_i log p_i (1-y_i) log(1-p_i) ]还要知道这个损失函数是从极大似然估计推出来的。为什么要用极大似然因为逻辑回归本身就是假设样本服从伯努利分布我们要找到一组参数使得当前样本出现的概率最大。面试官如果让你推导梯度你要能写出梯度表达式并解释为什么用梯度下降而不是直接求闭式解。原因很简单特征维度高、样本量大的时候正规方程求逆的复杂度是O(n^3)不现实。另外逻辑回归的“线性”体现在决策边界是线性的它本质上是在线性回归的输出上套了一个sigmoid函数做概率映射所以它解决的是二分类问题而且给出来的输出可以当作概率来理解。SVM的话重点是对偶问题和核函数。你不需要把整个KKT条件背得一字不差但至少要能解释为什么引入拉格朗日对偶因为原始问题直接解很困难对偶问题把优化变量从w和b变成拉格朗日乘子并且能自然引入核函数对偶问题中的内积可以用核函数替代让计算复杂度从高维空间降到样本数级别。核函数的作用是隐式地把样本映射到高维空间让原本线性不可分的数据变得线性可分。常见线性核适合文本分类这种本身维度就很高的场景多项式核适合特征维度低且样本量大的场景RBF核适用范围最广但要注意gamma参数的调节太大容易过拟合太小容易欠拟合。决策树要区分ID3、C4.5和CART。ID3用信息增益C4.5用信息增益比CART用基尼指数。为什么C4.5要改进信息增益因为信息增益会偏向取值多的特征比如“用户ID”这种特征每个取值对应一个样本按它划分能让子集纯净度最高信息增益就虚高但这样的划分完全没有泛化能力。C4.5用增益比来惩罚取值多的特征算是给ID3打了一个补丁。CART用基尼指数好处是计算比信息熵简单不用算对数。这些模型背后的“为什么”如果能答出来比单纯背公式印象好得多面试官也更愿意跟你聊下去。3.2 聚类、降维与评价指标计算K-means是聚类里最常考的流程要能脱口而出随机初始化K个中心点迭代计算每个样本到中心的距离并归属到最近的簇更新簇中心为簇内均值直到中心点不再变化或者变化量小于阈值。这里有两个高频追问点一是K怎么选一般用肘部法则或轮廓系数二是K-means对初始中心敏感所以实际使用会跑多次随机初始化取最优结果或者用K-means来优化初始中心的选择。热词里还有KNN这里要特别注意区分K-means是无监督聚类KNN是有监督分类两者名字像但思路完全不同。KNN的分类逻辑是看一个样本的K个最近邻居里哪种类别最多就把它分到哪类它不需要训练过程属于一种基于实例的学习。评价指标这块混淆矩阵、精确率、召回率、F1、ROC和AUC都是重点。你需要会手算一个例子假设正样本100个负样本900个模型预测出80个正例其中60个是真正的正例那么精确率是60除以80等于0.75召回率是60除以100等于0.6F1等于2乘以0.75乘以0.6除以(0.75加0.6)结果是0.6667。这类计算题在笔试里出现频率很高建议考前多练几遍别眼高手低。还有一个容易被考到的概念是KL散度注意它不是对称的KL(P||Q)不等于KL(Q||P)所以它不能叫距离只能叫散度或相对熵。KL散度衡量的是用一个分布Q去近似另一个分布P时损失的信息量在机器学习里它经常被用来衡量两个分布的差异。VAE的损失函数就和KL散度有关热词里的“kl elbo算法原理”指的就是VAE的推导逻辑直接最大化对数似然很困难转而最大化证据下界ELBO等价于最小化重构误差加上一个KL散度正则项。这个正则项把编码器学到的隐变量分布拉向标准正态分布让隐空间更规整。如果你能把这个逻辑讲清楚在面试里会是非常亮眼的加分项。PCA降维也是常见考点核心是找到数据方差最大的方向将高维数据投影到低维空间。PCA不关心类别标签是无监督方法它通过协方差矩阵的特征值分解来实现特征值大的特征向量对应保留信息最多的方向。做题的时候如果能说出“每个主成分的方差贡献率等于该特征值占总特征值的比例”基本就稳了。3.3 深度学习与Transformer基础深度学习这部分B站这类内容平台很关注因为视频推荐、内容理解、弹幕分析、画质增强都会用到深度学习模型。准备这份卷子的时候反向传播和梯度消失的基础一定要扎实。反向传播要知道链式法则梯度消失的原因通常是网络层数深且激活函数导数小于1。比如sigmoid的导数最大才0.25多个小于1的数连乘之后梯度趋近于零浅层参数几乎得不到更新。所以深层网络常用ReLU做激活函数因为它在正半轴的导数是1连乘不会导致梯度衰减。但ReLU也有问题如果某个神经元输入一直是负的梯度就是0这个神经元就再也激活不了这就是“神经元死亡”现象。解决思路包括LeakyReLU、参数化ReLU等变体以及合理的权重初始化策略比如He初始化。卷积神经网络要理解卷积核的感受野、参数共享以及池化层为什么能降低计算量和过拟合风险。感受野就是输出特征图上每个像素对应输入图像上的区域大小卷积层堆叠越深感受野越大。参数共享意味着同一个卷积核在图像不同位置都做同样的操作大幅减少参数量。池化层通过下采样减少特征图尺寸一方面降低计算量另一方面带来一定的平移不变性让模型对小范围的位置变化不那么敏感。如果是推荐方向Transformer会越来越重要。自注意力机制的核心是Q、K、V三个矩阵输入序列经过线性映射得到Q、K、V然后计算Q和K的点积除以根号d_k做缩放再过softmax得到注意力权重最后和V加权求和。缩放的原因是为了防止点积结果过大导致softmax进入饱和区梯度变得非常小影响训练。注意力的通俗理解就是每个词在编码的时候不再只依赖自己而是根据它和其他所有词的相关性来加权聚合整句信息这样能更好地捕捉长距离依赖。RNN处理长句的时候信息会丢失注意力机制没有这个问题所以它在NLP领域几乎全面替代了RNN。热词里有一条“腾讯视频ckey5.x算法_php版”虽然具体内容涉及商业算法不展开讨论但这件事说明在音视频平台算法岗位确实会牵扯到内容加密、签名验证和安全防护方向。如果你投的是B站这类视频平台最好把哈希算法、对称加密、非对称加密、数字签名这些基础概念过一遍哪怕笔试不考面试聊到的时候也能接得住。4. 编程题实战与答题策略4.1 典型动态规划题完整推演编程题部分我拿一道校招里出现频率非常高的题型举例最长上升子序列LIS。题目大概是这样给定一个无序数组求最长递增子序列的长度。注意子序列不要求连续只要保持相对顺序即可。最简单的DP思路是定义dp[i]表示以第i个元素结尾的最长上升子序列长度初始化dp[i]1因为每个元素自身就是一个长度为1的子序列。然后对每个i遍历它前面的所有j如果nums[j]小于nums[i]说明nums[i]可以接在以nums[j]结尾的上升子序列后面于是dp[i]max(dp[i], dp[j]1)。最后答案就是dp数组里的最大值。这个解法时间复杂度O(n^2)空间复杂度O(n)代码也简单def length_of_lis(nums): if not nums: return 0 n len(nums) dp [1] * n for i in range(n): for j in range(i): if nums[j] nums[i]: dp[i] max(dp[i], dp[j] 1) return max(dp)但如果数据量到10^5O(n^2)会超时这时候需要用贪心加二分的优化维护一个tail数组tail[len]表示长度为len的上升子序列的末尾元素的最小值。遍历每个数时在tail里做二分查找找到第一个大于等于当前数的位置把那个位置的值替换成当前数。这个优化版本的时间复杂度是O(n log n)代码稍复杂但非常值得写一遍因为“从O(n^2)到O(n log n)”的优化思路是面试官非常喜欢的展示点比你会背多少题更能体现算法功力。优化版的代码可以参考import bisect def length_of_lis(nums): tails [] for x in nums: pos bisect.bisect_left(tails, x) if pos len(tails): tails.append(x) else: tails[pos] x return len(tails)这里tails的长度就是最长上升子序列的长度但不保证tails里存的就是真实的LIS序列元素这点面试经常有人搞混。tails的意义是维护每个长度下的最小末尾值长度相同的情况下末尾值越小后面越容易接上更长的子序列。现场手写编程题的时候我会建议先写最朴素的版本确保逻辑对再提优化。千万不要一上来就写一个自己都说不清楚的花哨版本一旦边界条件出错调试时间会翻倍。写完代码之后还要口述复杂度并解释边界空数组返回0数组只有一个元素返回1所有元素相同返回1。这些细节都是得分点很多候选人代码逻辑没问题就是这些边界情况没考虑到导致提交判错。4.2 二分答案与边界写法的经验二分查找也是笔试大热门但很多人会写错边界。二分查找的核心要点是确定搜索区间是左闭右闭还是左闭右开然后在整个循环里保持这个区间定义不变这叫循环不变量。以左闭右闭为例经典写法是def binary_search(nums, target): left, right 0, len(nums) - 1 while left right: mid left (right - left) // 2 if nums[mid] target: return mid elif nums[mid] target: left mid 1 else: right mid - 1 return -1这里mid用left加上(right-left)整除2而不是直接用(leftright)整除2目的是防止整型溢出。这个细节在校招笔试里很少直接卡你但面试问起来会加分说明你写过大量代码而不是只看过答案。遇到“最小值最大、最大值最小”这类问法通常就是二分答案。比如“把数组分成m段使每段和的最大值最小”这类题把求解问题转化为判定问题给定一个上限mid能否用不超过mid的段和把数组分成m段。如果可以说明mid偏大缩小右边界如果不行说明mid偏小扩大左边界。能用“二分答案”思路解决的题难点不是二分本身而是能不能识别出这道题该用二分。判断方法很简单如果答案有明确的单调性即答案越大越容易满足条件或者答案越小越容易满足条件就可以用二分。二分还有一种容易出错的场景是查找左边界和右边界。查找第一个等于target的位置时等于的时候要收缩右边界查找最后一个等于target的位置时等于的时候要收缩左边界。这两句话听起来简单但很多人现场写的时候会搞反。建议平时多练几道二分变体题把左边界、右边界、插入位置的写法都固定下来形成肌肉记忆。4.3 笔试现场的时间分配与自查清单编程题的得分率很多时候不是在考场上决定的而是平时的练习习惯决定的。我建议拿到题目后不要立刻写代码先用5分钟把题目读懂标注数据范围然后想清楚暴力解能不能过。数据量小就直接暴力数据量大就分析复杂度再选算法。时间分配上我个人的经验是给编程题留出整套试卷60%以上的时间因为选择题不会就是不会蒙对的概率很低编程题只要把测试用例过了得分是实打实的。就算题目一时间没思路也要写一个暴力解或者最朴素的情况至少能拿部分分不要交白卷。阅卷系统按测试用例给分过一个用例就有一份的分这个策略很重要。写代码时先搭好输入输出框架再往中间填核心逻辑。遇到复杂逻辑写成独立函数方便调试。写完代码后至少留5分钟自查检查点包括数组越界、空输入、输入只有一个元素的情况、中间结果是否会溢出、循环是否会死循环、变量名是否一致。很多候选人代码一长就出现低级错误不是不会写而是没自查。这道工序在笔试里极其重要因为判题系统除了编译错误以外不会给你任何提示错一个边界整题就可能拿不到分。另外一个小技巧是编程题尽量用清晰可读的变量名不要为了省打字用a、b、c这种无意义命名。笔试虽然只有机器判题但有的公司会有面试官回看你的答题记录代码风格也是隐性评分点。而且命名清晰对你自己调试也方便代码写长了不会搞混。5. 编程题之外容易被忽略的拿分点与避坑指南5.1 选择题里的概率与数学题校招算法卷里概率题经常让人头疼B站这套也不例外。常见的概率题类型包括掷骰子求期望、随机游走求概率、古典概型计算。这类题目没有太多捷径重点是理解条件概率和期望的计算逻辑。看到一个概率题先判断事件之间是否独立。独立事件可以直接用乘法法则互斥事件用加法法则条件概率用贝叶斯公式。如果题目给了一个随机过程不妨先写出状态的转移关系再用递推或者动态规划的思路求解。概率题和算法题的思维其实是相通的本质上都是把复杂过程拆成简单步骤。还有一个高频考点是快速幂。计算a的n次方模p如果n很大直接循环n次会超时。快速幂的核心是二进制分解把n拆成二进制表示然后依次计算a的2的k次方遇到n的对应二进制位为1就乘到结果里。时间复杂度是O(log n)。这个知识点本身不难但很容易在考场上卡住建议代码模板背熟。5.2 简答题的高分表达方式简答题是很多人忽视的送分题但也是拉开差距的地方。像“请简述SVM的原理”“请说明XGBoost和GBDT的区别”这种问题大部分人都能写几句但得分差异很大。我的建议是简答题按照“定义、原理、公式、优缺点、应用场景”这个结构来答。先一句话说清楚模型是什么再讲核心原理然后给出关键公式再分析优缺点最后结合实际场景说明怎么选。这样做的好处是即使某一个环节没答完整前面的内容也已经覆盖了大部分得分点。比如问XGBoost和GBDT的区别不要只说“XGBoost加了正则化”要展开讲XGBoost在目标函数里加入了对叶子节点数和叶子权重的正则项防止过拟合XGBoost对损失函数做了二阶泰勒展开收敛更快XGBoost在特征选择上做了列抽样类似随机森林XGBoost能自动处理缺失值默认把缺失值分到增益最大的方向。能写出四五个差异点这题基本就稳了。5.3 考前最后一天应该做什么很多人考试前一天还在刷题这其实是低效的。以我的经验考前最后一天不应该再做新题而应该做三件事第一把高频模板代码默写一遍包括快速排序、二分查找、并查集、树的遍历、最短路、KMP的next数组、快速幂、二分答案模板确保肌肉记忆没错。第二把常见模型的损失函数和梯度公式熟读一遍不用深究推导但公式要能写出来。第三把时间分配策略固定下来比如选择填空40分钟简答20分钟编程题60分钟留10分钟检查提前规划好考场不慌。我见过不少候选人准备得非常充分但考场上因为时间分配不合理前边的选择题纠结太久后边的编程题只能草草写几行最终分数不理想。这种情况是最可惜的因为笔试考的不只是知识积累也是时间管理能力。6. 复盘心得与经验沉淀整套卷子刷下来我最深的感受是技术面试的趋势是越来越看重底层原理和工程落地能力的结合。以前很多候选人只需要会调库、会调参就能过笔试现在不行了。像B站这套卷子里出现的KMP推导、逻辑回归梯度、Transformer注意力机制每一个都是实打实的底层知识任何一个没弄懂都可能成为笔试的失分点。我建议准备校招的同学把这份卷子当成一个“知识地图”而不是单纯的一张考卷。拿到题之后对照自己的知识盲区逐个击破。已经会的知识点快速过一遍就行不会的知识点不要只看答案一定要亲手推导一遍。比如KMP的next数组你光看答案是记不住流程的你得自己拿笔在纸上画三五个例子画熟了才算真正掌握。再有就是编程题的训练不能只刷力扣热门题。校招笔试的编程题往往和公司的业务场景有关联比如视频平台可能会考弹幕时间序列处理、推荐系统可能会考多路归并排序。所以除了经典算法题也要适当了解业务场景里的算法问题。这样做的好处是即使笔试碰不到原题面试聊项目的时候也能展示出你对业务算法的理解深度。最后再分享一个我实践下来很有效的学习方法准备一个错题本专门整理笔试和刷题中做错的知识点按“题目类型、错误原因、正确思路、同类题扩展”四栏记录。笔试前只需要翻错题本就行不需要把所有资料再过一遍。这个方法帮我带过的不少候选人节省了大量复习时间亲测有效强烈推荐。