ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

小红书校招算法笔试题解析:核心考点与高效刷题策略

2026/8/31 20:45:47 拓冰建站 浏览量
小红书校招算法笔试题解析:核心考点与高效刷题策略 1. 小红书2020校招算法笔试题整体拆解1.1 这套笔试题的定位与岗位背景小红书2020年校招算法岗的笔试放在今天看依然有很强的参考价值。原因很简单这家公司的推荐、搜索、内容理解、风控体系都建立在算法之上而且它的数据形态——图文笔记、短视频、用户互动行为——跟传统电商和纯信息流产品有本质区别。笔试出题方向直接反映了业务侧对算法工程师的能力预期这决定了它不会只考八股文式的机器学习理论而是会混合考察代码功底、算法思维和数据敏感度。卷二这个编号说明是第二批次的试题和卷一相比整体难度分布会有微调但核心考核维度不变候选人能不能在有限时间内把一道算法题写对、把一道模型题讲清、把一个场景题拆明白。很多同学刷题时只盯着LeetCode忽略了这一层结果真正上考场时被题型结构打了个措手不及。从各技术社区对这套题的回忆帖来看卷二覆盖三个明显方向代码实现题偏数据结构与经典算法机器学习基础题偏模型原理与推导场景开放题偏推荐系统和内容理解。这个结构对准备校招的同学来说其实是一个很好的“能力体检表”——哪里薄弱一测便知。1.2 题量、题型与时间分配整体来看卷二包括选择题、手写代码题和简答/场景题三种形式总时长通常在90到120分钟。选择题考察基础概念的精确度代码题考察实现的正确性和边界处理能力场景题考察系统思维和业务理解深度。我的建议是时间分配遵循“5比3比2”原则代码题花一半时间因为这部分最容易通过训练提分而且代码产出是硬指标选择题花三成时间控制在每题一分钟到一分半简答场景题预留两成时间做结构化输出。很多人在选择题上纠结太久导致后面的编程题仓促交卷这是最不划算的。另外需要特别提醒小红书这类互联网公司的笔试通常是在牛客网等在线平台完成代码题需要在线运行环境是标准的C、Java、Python三选一。如果你对某个语言的输入输出处理不熟考前一定要练几道在线判题环境的题目不要因为字符串分割这种小事翻车。2. 核心考点深度梳理不只是“刷题”这么简单2.1 机器学习基础理论考点分布机器学习基础是选择题和简答题的主战场。从卷二反馈来看考点集中在几块损失函数与优化方法、正则化的原理与效果、偏差方差分解、集成学习的基本思想、特征选择与降维、模型评估指标。这里有个容易忽略的细节小红书非常看重候选人对“样本不均衡”问题的理解。因为推荐场景里正负样本天然失衡点击率模型的正样本往往只有百分之几。所以卷二里出现了关于召回率、精确率、F1值、AUC的辨析题这不奇怪。关键是你要理解AUC为什么对样本不均衡相对鲁棒而准确率为什么不行。我建议复习时不要死记公式而是能用一句话说出每个指标背后的业务含义。比如AUC的物理意义是“随机抽一个正样本和一个负样本模型给正样本打分更高的概率”。面试官随便换个问法理解到位了就能答出来背答案的就会卡壳。另外损失函数部分要特别注意交叉熵和均方误差的适用场景。在分类问题上为什么用交叉熵而不用MSE因为MSE配合Sigmoid的时候梯度更新太慢容易陷入局部停滞。如果能补充这个推导过程在简答题里会很加分。2.2 数据结构与经典算法考点代码题部分的数据结构与算法考点非常典型。从卷二的题目回忆来看涉及字符串匹配、二分查找变体、链表操作、二叉树遍历与深度计算、拓扑排序、最短路问题、动态规划入门题。字符串匹配这里KMP算法的next数组是高频考点。很多同学能背出KMP的匹配过程但一让手动计算next数组就出错。这个必须在考前动手推几遍尤其是“最长相等前后缀”的计算不是看会了就行一定要自己写一遍完整的推导过程。关于热搜词里反复出现的排序算法我的判断是笔试直接让你手写快排的概率不太高但可能会问“排序算法的稳定性比较”“快排的最坏情况是什么”“归并排序的空间复杂度为什么是O(n)”这类概念题。另外在具体业务场景里选排序方案的题也可能出现比如对一个几乎有序的大数组排序用插入排序就比快排更合适这体现的是工程判断力。图论算法方面Dijkstra是经典的不能再经典的考点。除了要会写堆优化的版本还要理解为什么Dijkstra不能处理负权边。如果题目里出现了负权边应该用什么算法Bellman-Ford或者SPFA。这类追问在笔试简答题里经常以“小问套小问”的形式出现。2.3 深度学习与模型调优方向2020年这个时间点Transformer已经全面崛起深度学习相关题目在卷二里占了一定比重。主要方向包括CNN的基本组件及其作用、RNN的梯度消失问题、Attention机制、Batch Normalization的作用、过拟合的解决方法、常见激活函数的对比。这里有个值得深挖的点Batch Normalization为什么能解决Internal Covariate Shift它到底是在哪个维度上做归一化很多同学只知道BN是“对一批数据归一化”但说不清楚是在feature map的通道维度上操作。这种情况在笔试选择题里最容易被设坑。关于激活函数要能画出Sigmoid、Tanh、ReLU、Leaky ReLU的曲线并解释各自优缺点。ReLU在正区间导数为1缓解了梯度消失但负区间硬饱和会导致神经元死亡所以有了Leaky ReLU。这类对比逻辑清晰选择题和简答题都爱考。另外Transformer里的Self-Attention为什么除根号d_k以及Multi-Head的意义也是我当时刷题时高频遇到的追问。这两问答得好基本能证明你真的用过Transformer而不是只看过结构图。3. 高频题型与解题思路剖析3.1 字符串匹配类题目KMP的next数组怎么算KMP的next数组计算是笔试里的常客。题目会给一个模式串要求写出其next数组或nextval数组然后在目标串上模拟匹配过程。以模式串pabacaba为例我带你手算一遍next数组。next[i]的定义是模式串前i个字符组成的子串中最长相等前后缀的长度有些教材实现是next[i]表示失配后跳转的位置所以值可能整体减1或者偏移。这里我采用最常见的定义next[i]表示p[0...i-1]的最长相等前后缀长度其中next[0]-1是哨兵。计算过程如下next[0] -1约定i1时子串a没有相等的前后缀next[1] 0i2时子串ab前缀a后缀b不相等next[2] 0i3时子串aba前缀a等于后缀a长度为1再看ab和ba不相等所以next[3] 1i4时子串abac前缀a等于后缀c吗不等。长度为0next[4] 0i5时子串abaca前缀a等于后缀a长度为1前缀ab等于后缀ca吗不等。next[5] 1i6时子串abacab前缀ab等于后缀ab长度为2再看最长的是否有3前缀aba和后缀cab不等。next[6] 2i7时子串abacaba前缀aba等于后缀aba长度为3有没有更长前缀abac和后缀caba不等。next[7] 3所以pabacaba的next数组为[-1, 0, 0, 1, 0, 1, 2, 3]。在实际刷题中我建议你把next数组的计算过程写成一个独立函数并测试几个经典模式串比如aaaaab、abcabcabc这类有重复结构的可以很好地检验你的计算逻辑是否正确。注意不同教材对next数组的定义有差异有的把next[i]定义为“失配时模式串跳转到的位置”即-1开头版本有的定义为“最长相等前后缀长度”即0开头版本。考试时一定要看清题目里的定义说明。3.2 图与搜索类题目最短路与贪心边界Dijkstra算法是图论题的常青树。手写一个朴素的O(n^2)版本不难但笔试和面试更希望看到堆优化版本因为这才是实际工程中能应对大规模图的写法。堆优化Dijkstra的核心是用优先队列维护当前未访问节点中距离最小的节点每次取出并松弛其邻接边。这里有一个值得注意的细节Dijkstra的贪心策略是在“所有边权为正”的前提下成立的。为什么因为当从优先队列里取出一个节点u时它的dist[u]已经是全局最小之后不可能通过其他路径绕回u并得到更小的距离。如果存在负权边这个前提被破坏贪心失效就要改用SPFA或Bellman-Ford。除了最短路拓扑排序也是二卷容易被考到的点。Kahn算法属于经典解法维护每个节点的入度将入度为0的节点入队依次弹出并更新邻接节点入度。这里要特别注意图的边可能重复、存在环的检测以及输出顺序是否符合题目要求。举个例子有向图节点1到5边为[1,2]、[1,3]、[2,4]、[3,4]、[4,5]用Kahn算法输出拓扑序。入度初始1入度为02为13为14为25为1。队列先入1弹出后2和3入度减为0入队弹出24入度减为1弹出34入度减为0入队弹出45入度减为0入队最后弹出5。拓扑序为1,2,3,4,5。这样走一遍流程答题时就不容易漏掉节点。3.3 概率统计类题目的计算套路算法笔试题里概率统计经常以选择题或简答填空的形式出现考察你能否快速建立概率模型并计算。常见类型有古典概型计算、条件概率与贝叶斯公式、期望与方差、常见分布二项、泊松、正态、均匀的性质。一个典型题目某推荐系统给用户推荐内容用户点击概率为0.2系统一天推荐5次问用户至少点击1次的概率是多少这需要用1减去“一次都不点击”的概率即1减去0.8的5次方约等于0.67232。这种题看起来简单但在紧张状态下容易算错指数建议直接用分布列公式写出过程不要心算。贝叶斯公式的题也很高频尤其是在内容审核或垃圾内容识别场景里。比如已知某内容为垃圾内容的先验概率是0.1分类器对垃圾内容识别准确率为90%对正常内容误判为垃圾的概率为5%问一条被分类器判为垃圾的内容它真的是垃圾的概率有多大。用贝叶斯公式计算分子是0.1乘0.9分母是0.1乘0.9加0.9乘0.05结果是0.9除以1.35约等于0.6667。这类题关键是把事件定义清楚别把条件概率的方向搞反。4. 实战刷题路径与备考方案4.1 针对性的刷题顺序结合卷二这类互联网公司算法笔试的特征我建议按“先高频后冷门、先模板后变形”的顺序来刷题。第一优先级是字符串和数组类的基础题。包括字符串匹配、滑动窗口、双指针、哈希表计数。这类题数量大、出镜率高而且做题套路相对固定适合用来建立信心。你需要熟练到30分钟内能写出无bug的代码。第二优先级是树和图。二叉树的前中后序遍历、层序遍历、最大深度、最近公共祖先图的DFS、BFS、拓扑排序、最短路、最小生成树。这些题可以整理成模板考场上直接套用节省大量时间。第三优先级是动态规划。背包问题、最长上升子序列、编辑距离、打家劫舍系列把经典模型刷透理解状态转移方程的推导过程而不是死记代码。最后是冷门但可能考的数学和位运算题。比如快速幂、最大公约数、判断素数、位操作统计二进制中1的个数。这些题通常代码量不大但思路巧妙一旦考到就是拉分项。此外对于机器学习算法岗位的笔试不要只刷纯代码题还要花时间复习模型评估和特征工程。可以给每种模型准备一个“一句话原理加一个关键公式加一个适用场景”的模板这样选择题和简答题都能快速反应。4.2 易错点记录与复盘方式刷题效率的一个重要分水岭是复盘方式。很多人刷题只在乎“AC了没有”忽略了总结归纳结果做过的题换个问法又不会了。我自己的经验是每做完一道题单独建一个文档记录三点——这题的考点是什么、我最初在哪里卡住了、这个解法能不能泛化到其他类似题目。举个例子做“最长回文子串”这道题时中心扩展法的时间复杂度是O(n^2)Manacher算法是O(n)。如果只是AC了中心扩展法就不再深入下次遇到“最长回文子序列”就可能无从下手。但如果复盘时把这两者放在一起对比你会发现一个是在原串上连续扩展一个是在子序列上用动态规划边界条件完全不同多总结几次就能形成自己的解题框架。我还发现一个高频易错点在线判题时输入输出格式处理。Python的sys.stdin.readline()和input()在处理多行输入时有区别C的cin和getline在遇到空格时会表现不同。这些属于环境问题平时刷LeetCode看不出来但上了牛客一类的笔试平台就很容易踩坑。考前务必找到平台的环境说明用提供的样例测试一遍输入输出模板。再有就是边界条件这是代码题失分最多的原因。比如数组为空、只有一个元素、字符串全部相同、目标值不存在这些情况都要在写代码时考虑进去。我写代码有个习惯先处理边界情况再写主逻辑写完后再手动跑一遍边界用例心里才有底。5. 考场上容易踩的坑和排查技巧5.1 代码实现层面的常见失误我把历年校招笔试里同学反馈最多的代码失误整理成了一张速查表按题型分类方便你考前过一遍。题型常见失误排查要点二分查找死循环检查mid更新方向注意left和right的收缩条件链表反转指针丢失画图辅助保存next节点后再改指针二叉树层序遍历忘记记录每层节点数用queue.size()固定本轮要处理的节点数动态规划初始化错误检查dp[0]或dp[i][0]的值是否正确KMPnext数组计算错误手动模拟一遍模式串前缀后缀匹配图的遍历漏掉已访问标记入队/递归前设置visited避免重复访问字符串处理未考虑空串输入后先判空再处理业务逻辑排序快排最坏情况超时考虑随机选pivot或三数取中或直接用堆排序考场上还有一个很常见的心理陷阱纠结一道选择题太久浪费了后面编程题的时间。我的经验是选择题碰到犹豫超过2分钟的先标记最后有剩余时间再回来推导。笔试平台通常支持题目标记别死磕。5.2 时间分配与答题顺序答题顺序对整个成绩的影响比很多人想象的要大。我个人倾向“先易后难、先代码后简答”的顺序。先做自己最有把握的题目不管它在试卷的哪个位置。这样做有两个好处一是快速建立稳定心态拿到基础分二是避免因为卡在某道难题上导致后面的题完全没时间看。代码题通常是整个卷子的核心尽量保证有充足的时间调试因为编码题的结果判定完全是0和1,一个隐藏的边界错误就可能让你全题丢分。简答题和场景题反而是单位时间内“性价比”最高的部分。因为这类题目没有标准答案只要逻辑清晰、结构完整、关键点到位就能拿大部分分数。遇到不会的场景题哪怕只写出问题拆解思路和行为数据分析的步骤也比空着强。时间安排上如果总时长是120分钟我的建议是选择题最多40分钟代码题50分钟简答题30分钟最后留10分钟检查。检查时重点看代码题的输入输出格式是否一致以及有没有漏掉题目里“多组测试数据”的要求。在这里多提一句调式技巧在线笔试平台没有本地IDE那么友好的断点调试但你可以善用print/System.out.println输出中间变量逐步排查。代码写完后即使题目没有明确要求也要自己在脑海里多跑几个测试用例特别是边界用例。这一步能帮你找出很多隐藏错误。6. 简化但不简单的算法几种高频热门算法的快速掌握法6.1 粒子群算法与模拟退火的异同搜索热词里频繁出现粒子群算法和模拟退火算法说明这类启发式优化算法在校招笔试和理解题里也有亮相。这两种算法从本质上看都是求解最优化问题的“无梯度方法”但它们的设计哲学差别很大。粒子群算法受到鸟群觅食行为的启发每个粒子代表解空间中的一个候选解具有位置和速度两个属性。每一轮迭代粒子会根据自身历史最优位置和群体历史最优位置更新自己的速度再更新位置。核心公式是v_new w * v_old c1 * r1 * (pbest - x) c2 * r2 * (gbest - x)其中w是惯性权重控制粒子保持原有运动趋势的程度c1和c2是加速常数分别控制个体认知和社会认知的影响r1和r2是[0,1]之间的随机数。如果w设得较大算法倾向于全局搜索w较小则倾向于局部精细搜索。模拟退火算法则来自金属退火工艺的类比。它在搜索过程中以一定概率接受比当前解更差的解这个概率由温度参数T控制。温度高时接受差解的概率大有利于跳出局部最优温度逐渐降低接受差解的概率越来越小最终收敛。经典的概率公式是exp(-delta_E / T)delta_E是当前解和新解的目标函数差值。如果delta_E为负新解更优一定接受如果为正新解更差则以概率接受。两者对比粒子群算法实现简单、收敛快适合连续优化问题但容易早熟陷入局部最优模拟退火理论上能收敛到全局最优但收敛速度慢调参对结果影响大。笔试里如果考到二者区别往这个方向答基本不会跑偏。6.2 从KMP到BM字符串匹配的工程进化学习KMP之后不少人会觉得字符串匹配也不过如此但其实KMP还有现代化改进比如BM算法和Sunday算法在实际工程中也很常用。笔试简答题偶尔会问“为什么编程语言的indexOf函数效率很高”这个问题背后就是一系列字符串匹配算法的演进。KMP的核心在于利用next数组避免主串指针回退时间复杂度稳定在O(mn)。BM算法则从模式串的末尾开始匹配利用坏字符规则和好后缀规则跳过大量不必要的比较在文本串较长时效率高于KMP。Sunday算法更进一步它关注主串中与模式串末尾对齐的下一个字符如果该字符不在模式串中则可以把模式串直接向后滑动到该字符之后跳过的距离最大化。从笔试角度看理解KMP是必选动作因为它的next数组计算既有算法逻辑又有细节陷阱而BM和Sunday更多是概念理解层面能说清楚它们比朴素匹配快在哪里即可。如果你在简答题里能主动补一句“C的std::string::find在不同STL实现中可能采用不同策略有的会针对短模式串做特殊优化”面试官会觉得你确实有工程视野。6.3 排序算法的场景化选型思维排序算法在笔试中很少直接考“手写快排”这种题了更多是考“这个场景用什么排序最合适”。这种题没有唯一标准答案但回答思路要体现你对时间复杂度和空间复杂度的权衡。比如数据量很小几十个元素且基本有序插入排序反而是最优选择因为它的常数因子小且对有序数据的比较次数接近n。又比如数据量很大且要求稳定排序归并排序是最佳候选但它需要O(n)的额外空间。如果内存紧张就要考虑原地稳定的排序算法这时可以用原地归并的思想去优化或者接受快排的不稳定性。还有一个容易考到的是外部排序。当数据量超过内存容量时需要对大文件进行外部排序基本思路是归并排序的分治思想将大文件切分为多个能载入内存的块每一块内部排序后写入临时文件再用K路归并合并。K路归并通常配合败者树或堆来优化比较次数这也是海量数据面试题的常见变体。建议把常见排序算法的时间复杂度、空间复杂度、稳定性整理成一张表打印出来做床头贴。笔试前扫一眼回答选择题速度快到飞起。7. 关于刷题与备考我再多说几句最后分享几条我自己的实际操作体会。第一不要沉迷于“收集题解”。很多同学收藏了无数篇干货文章一篇文章都没读完这种虚假的获得感对笔试没有任何帮助。你真正要做的是每天固定刷两三道题把每道题都吃透包括题目变形和边界情况。第二一定要动手写代码不要只是在脑子里想思路。笔试考的是“写出来且运行通过”不是“想明白”。我见过太多同学在讨论时思路头头是道一上机就频繁语法错误、数组越界。建议每天保持至少30分钟的实际编码练习用标准的输入输出处理方式写一遍。第三机器学习方向的候选人不要只刷算法题还要定期复习模型评估、特征工程、样本不均衡处理这些面试高频点。可以给自己出几道模拟面试题比如“如果推荐系统的点击率下降了你会从哪里开始排查”然后像我上面那样把分析步骤写出来。这套2020年的小红书卷二虽然时间过去了一段时间但它的出题思路和考点分布在今天的校招笔试题里依然很有代表性。算法基础、机器学习理解、工程实现能力、业务场景拆解这四件事在任何一届校招里都不会过时。希望这篇拆解能帮你把备考方向理清楚少走一些我当时走过的弯路。