ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

小红书校招算法笔试复盘:从KMP到卡尔曼滤波的考点全解析

小红书校招算法笔试复盘:从KMP到卡尔曼滤波的考点全解析 1. 从热搜词反推的考点地图这份卷子到底在考什么每年秋招季算法笔试都是淘汰率最高的一道闸门。小红书2020校招算法笔试题卷二网上留下的真题资源不多但从相关热搜词里能清晰看到命题组的侧重点KMP算法、快速幂、贪心、堆排序、BM25、卡尔曼滤波、PID控制、图像处理算法……这些关键词像一张考点地图直接映射出不同岗位方向对算法能力的不同要求。先说一个很多人对校招算法笔试的误解——它不是用来筛选“谁刷题最多”的而是用来筛选“谁能在有限时间内把题目正确地抽象成算法模型并高效地实现出来”。小红书作为内容社区平台推荐系统、搜索、NLP、图像理解是其核心业务方向所以卷二里的算法题不会只停留在LeetCode级别的“手撕代码”而是会和真实业务场景做一定程度的绑定。从热词聚合度来看卷二覆盖了四大类考点字符串与数据结构类KMP、Trie、堆排序、二叉树考的是算法基本功和代码实现力。数值计算与数学类快速幂、大数处理、概率统计考的是数学建模能力。机器学习与搜索相关性类BM25、聚类、KNN、以及一些和Embedding相关的概念考的是算法工程师的领域知识。信号处理与控制类音频重采样、卡尔曼滤波、PID、FOC这一块主要面向音频算法、控制算法等偏硬件或信号处理的岗位。这一篇我用“试卷复盘知识点串联避坑经验”的方式帮你把卷二背后真正想考察的能力拆开揉碎。无论你是准备校招的应届生还是想转行做算法工程师的在职者这份分析都能让你少走弯路。2. 字符串与数据结构题KMP的next数组只是开胃菜字符串算法是算法笔试的常客卷二在这个板块的考察密度相当高。热搜词里专门出现了KMP算法而且给出了一个具体例子模式串pabacaba要求求解其next数组。这个示例很典型我在面试辅导中经常用它来检验候选人是不是真的理解了KMP而不是死记硬背。2.1 手撕KMPabacaba的next数组到底怎么算很多人的困惑在于next数组的两种定义一种是next[i]表示模式串前i个字符组成的子串中最长相等真前缀和真后缀的长度另一种是失配时跳转到哪个位置。这两者的差别是笔试里的经典扣分点。常规教材里用的是“失配跳转”的版本即next[i]表示当P[i]失配时模式串应该回退到的位置下标。以pabacaba为例我们用失配跳转版计算next数组规定next[0] -1这是KMP的标准初始值表示第一个字符就失配时无法回退。i1前缀a没有真前缀失配回退到0所以next[1] 0。i2前缀ab最长相等真前后缀长度为0失配回退到0next[2] 0。i3前缀aba真前缀a等于真后缀a长度1失配回退到1next[3] 1。i4前缀abac没有相等的真前后缀next[4] 0。i5前缀abaca真前后缀a相等长度1next[5] 1。i6前缀abacab真前后缀ab相等长度2next[6] 2。i7完整串abacaba最长相等真前后缀是aba长度3失配回退到3next[7] 3。所以next数组为[-1, 0, 0, 1, 0, 1, 2, 3]。注意如果笔试题里明确说了“next[i]定义为前i个字符的最长相等真前后缀长度”这一种版本第一位就是0而不是-1结果会是[0, 0, 0, 1, 0, 1, 2, 3]。做题先看清定义这两者的差异足以让你丢一整道题的分。2.2 KMP之外的隐藏考点Trie树与字符串哈希卷二不会只考一个KMP完事。热搜词里虽然没有直接出现Trie但结合小红书搜索和推荐场景Trie树、AC自动机这类多模式串匹配的数据结构同样是算法笔试的“隐藏常客”。字符串哈希是另一个性价比极高的考点。用一个多项式哈希H(s) (s[0]*base^(n-1) s[1]*base^(n-2) ... s[n-1]) mod M可以在O(1)时间内判断任意两个子串是否相等。笔试里如果碰上“判断一个长文本中是否包含某个模式串的变体”这类问题字符串哈希配合二分法能做很多事情。我当时自己做题时的习惯是每道字符串题先问三个问题——单串匹配还是多串匹配是否允许预处理对时间复杂度有没有硬性要求把这三个问题想清楚再动手比上来就背模板靠谱得多。2.3 堆排序和排序稳定性的实际意义排序算法的热搜词密集出现在“数据结构排序算法”“堆排序算法”“冒泡排序算法C”等条目上这基本可以判断卷二里有排序相关的手写代码题。在我接触到的历年面经里小红书比较喜欢考堆排序和快速排序的变体比如“求数据流中的Top K”或“求第K大的元素”。堆排序的核心掌握点有两个建堆的复杂度为什么是O(n)而不是O(n log n)。这个需要理解siftDown的累加计算深度越深的节点数量越多但下沉的比较次数越少求和后是线性复杂度。如果面试官追问这一点很多人会卡壳。堆排序是不稳定的。因为堆调整会打乱相同元素的相对位置。而小红书这类推荐场景中当用户标签权重相同时排序稳定性可能直接影响推荐顺序这就把数据结构考点和业务场景挂钩了。3. 数值算法与概率数学题快速幂看起来“送分”实则暗藏陷阱3.1 快速幂递归写法往往是笔试里的坑热搜词里出现了“快速幂算法C”说明卷二确实覆盖了快速幂。普通的幂运算a^n时间复杂度是O(n)当n达到10^9级别时必然超时。快速幂的核心思想是把指数拆成二进制形式例如计算a^1313 1101₂ 8 4 1所以a^13 a^8 * a^4 * a^1只需要4次乘法而不是13次。算法上采用二分折半或二进制展开每次把指数右移一位底数做平方如果当前最低位为1就累乘进结果。时间复杂度降到O(log n)。笔试里这个题最容易出问题的地方不是“快速幂”本身而是取模运算。很多候选人写res (res * base) % mod时没有注意到类型溢出。当mod接近int上限时两个int相乘的结果会超过int范围。在C里应该显式用long long中间变量或者用__int128。在Java里则要小心int溢出的问题需要转成long计算再转回int。第二坑是快速幂的递归深度。如果编译器没有尾递归优化递归版快速幂在指数大时会栈溢出。笔试时能写迭代版就不要写递归版既省栈空间也能避免因递归调用产生的性能损耗。一个标准的迭代版C实现如下long long fastPow(long long base, long long exp, long long mod) { long long res 1; base % mod; while (exp 0) { if (exp 1) res (res * base) % mod; base (base * base) % mod; exp 1; } return res; }这道题延伸出来的考点是矩阵快速幂用于求解斐波那契数列第n项、线性递推、图上的路径计数等问题。它们的核心思想完全一致只是把标量乘法换成了矩阵乘法。如果卷二里出现“求斐波那契数列第10^18项”这类题矩阵快速幂就是标准解。3.2 贪心算法的高频场景区间问题与分配问题贪心算法是校招笔试中性价比极高的一类考点。它的判断依据不是“这题能不能用贪心”而是“为什么能用贪心”。写代码本身不难难的是证明贪心策略的正确性。笔试通常不会要求完整证明但你需要知道贪心的核心原则每一步都做当前看起来最好的选择并相信局部最优能导出全局最优。我在面经里见过的最典型的贪心题是区间选择问题给定若干区间选择尽量多的互不重叠的区间。经典解法是按区间的结束时间排序然后依次选择结束时间最早且与已选区间不冲突的区间。这里“为什么按结束时间排序”的解释可以从两个层面理解。从直觉上结束时间越早留下给后续区间的空余就越长能容纳更多区间。从反证角度如果最优解中第一个选择不是当前结束时间最早的区间那么把它替换成最早结束的那个区间不会影响后续选择的空间因此结果不会更差。这个替换论证就是贪心正确性的核心证明方式。注意同样是区间问题如果是“求覆盖整个线段的最少区间数”贪心策略就变成按开始时间排序而不是按结束时间排序。两种场景一个按左端点一个按右端点搞反了就是零分。平时刷题时可以把贪心类题按“排序键”做一个脑图考试时先判断排序规则再写代码。3.3 二分图与网络流题为什么说“会做是加分项”热词里出现了“二分图HK算法”说明卷二里可能有二分图匹配相关的题或者至少搜索引擎把这个热词和试卷关联了起来。匈牙利算法是处理二分图最大匹配的标准算法时间复杂度O(VE)而HK算法Hopcroft-Karp用BFS分层配合DFS增广优化后达到O(E√V)。在手写实现上匈牙利算法的核心是一个DFS尝试为集合A中的每个顶点寻找增广路的过程。如果笔试时间不够写对匈牙利算法已经能拿到大部分分数HK算法更多是面试深挖时展示深度的加分项。我当时备考的经验是要能徒手写出匈牙利算法并且能解释“为什么DFS找到了增广路就相当于增加了匹配数”这个原理讲不清楚面试官会怀疑你是背的模板。4. 机器学习与搜索相关性题看到BM25就知道是推荐搜索岗的萝卜坑4.1 BM25算法的原理与手推BM25出现在热词里不意外。它是搜索引擎中用于计算文档与查询相关性的经典算法也是许多推荐系统召回阶段的核心组件。如果卷二给出一段文档集合和查询词要求计算相关性得分考的就是对BM25公式的理解。BM25的计算大致包含三个部分词频因子词在文档中出现越多次相关性越高但增长是饱和的。公式中的(k1 1) * tf / (k1 * (1 - b b * dl / avgdl) tf)其中k1控制词频饱和度b控制文档长度归一化力度。逆文档频率因子IDF ln((N - n 0.5) / (n 0.5))N是文档总数n是包含该词的文档数。出现越稀有的词IDF越高。文档长度归一化dl / avgdl表示当前文档长度与平均长度的比值避免长文档因为词多而天然得分偏高。笔试里计算BM25时如果没有明确规定参数k11.2~2.0、b0.75是经验默认值。但要注意BM25的IDF部分在极端情况下会出现负值比如当词出现在超过一半文档中时ln内部会小于1。一些工程实现会直接截断为0此时如果笔试题要求“计算得分”需要先确认题目给定的IDF定义以此判断是否可能出现负值。4.2 KNN与聚类的应用边界热词里出现了“KNN算法的应用能力包括哪三个方面”和“聚类算法”这提示卷二可能有一道关于KNN的简答题或选填题。KNN的三个核心应用能力可以归纳为分类用K个近邻的多数投票决定样本类别、回归用K个近邻的均值预测连续值、异常检测距离K个近邻过远的样本视为离群点。要注意的是KNN是典型的“懒学习”算法训练阶段几乎不做计算只存储样本预测时才计算距离。这个特点决定它在高维数据上会遇到“维度灾难”距离度量失效。笔试如果问“KNN的缺点”你需要能答出计算复杂度高、对特征缩放敏感、高维效果差这三条。聚类方面K-Means是必考重点。它的三步流程——初始化K个质心、分配样本到最近质心、更新质心——需要能默写出来。常见的衍生问题有K值怎么选肘部法则、轮廓系数、初始质心对结果的影响K-Means优化、收敛条件质心不再变化或达到最大迭代次数。4.3 从BM25、KNN到推荐系统为什么笔试要考这些如果把搜索推荐岗的笔试题串起来分析你会发现命题组其实在考察“候选人是否理解了召回→粗排→精排→重排”这个推荐系统基本链路。BM25属于召回或精排的经典基线模型KNN则可以用于协同过滤里的用户相似度计算聚类可用于用户分群。笔试不要求你有工业级系统的实操经验但要求你能在给定小规模数据上完成一次完整的“数据→特征→模型→评估”闭环。5. 信号处理与控制算法题卡尔曼滤波与PID小众岗位的“筛选器”热词里出现了“卡尔曼滤波算法”“PID算法”“FOC算法”“音频重采样算法”这些条目和字符串、机器学习题的考察基调完全不同。它们更像是在为音频算法工程师、控制算法工程师、自动驾驶感知算法工程师等细分岗位准备的。从多轮校招的情况来看小红书的算法笔试卷会按照投递方向出不同的试卷——用户推荐方向的卷子可能偏向机器学习与数据结构音视频方向的卷子就会涉及信号处理。因此如果卷二里出现卡尔曼滤波和PID基本可以判断这套卷子面向的是偏底层信号处理或硬件控制的岗位。5.1 卡尔曼滤波的五条黄金公式卡尔曼滤波的核心价值是从带有噪声的观测值中估计系统的真实状态。它的五个核心公式可以分为两组。预测阶段先验估计状态预测x̂ₖ⁻ A x̂ₖ₋₁ B uₖ协方差预测Pₖ⁻ A Pₖ₋₁ Aᵀ Q更新阶段后验修正卡尔曼增益Kₖ Pₖ⁻ Hᵀ (H Pₖ⁻ Hᵀ R)⁻¹状态更新x̂ₖ x̂ₖ⁻ Kₖ (zₖ - H x̂ₖ⁻)协方差更新Pₖ (I - Kₖ H) Pₖ⁻其中Q是过程噪声协方差R是测量噪声协方差。笔试如果考卡尔曼滤波的推导通常不会要求完整推导但至少需要你理解Kₖ的含义——它是模型预测值和观测值的信任权重分配器。R越小说明观测越可信Kₖ越大滤波结果越偏向观测值Q越小说明系统模型越精确Kₖ越小结果越偏向预测值。我当时备考这一块的心得是卡尔曼滤波最难的不是公式本身而是“状态变量怎么定义”。同一道题不同人定义的A、H矩阵不同目标跟踪效果差异极大。笔试时如果给你一个物体匀速运动模型状态向量往往取[位置x, 速度v]这时A [[1, Δt], [0, 1]]H [1, 0]表示只有位置可以被观测。5.2 PID算法三个参数为什么一个都不能少PID是控制领域最经典、应用最广泛的算法。笔试考PID通常是两种题目一种要求写出增量式PID的公式另一种是给定输入输出判断调节方向。PID的三个环节各自的职责是比例项P根据当前误差的大小给出修正误差大则修正大积分项I累计历史误差消除稳态误差微分项D预测误差变化趋势抑制超调。三者配合才能做到“快、准、稳”。增量式PID的输出是控制量的增量Δu(k) Kp[e(k)-e(k-1)] Ki e(k) Kd[e(k)-2e(k-1)e(k-2)]。笔试常问的坑是增量式PID和位置式PID的根本区别是什么。答案是增量式只输出增量的变化不直接累计全部误差因此当执行器有保持功能时即使控制器故障输出也不会出现大幅跳变。这在无人机、机械臂等安全关键领域非常重要。PID没有通用参数整定方法最常用的是经验试凑法先只加P让系统震荡临界再加D消除震荡最后加I消除稳态误差。笔试考场没有实物但需要答出这个流程这考查的不是背结论而是工程调试思路。5.3 音频重采样与FOC算法行业特色的“附加题”音频重采样是音视频算法岗的高频考点。它本质上是一个“采样率转换”问题比如把48kHz的音频转成44.1kHz核心步骤是插值→低通滤波→抽取。笔试常考题是“重采样过程中为什么需要低通滤波器”答案是为了防止频谱混叠。当目标采样率低于原始采样率时信号中高于目标采样率一半的频率成分会混叠到低频导致失真低通滤波器能先把高频成分滤掉再抽取就不会混叠。FOC磁场定向控制是一种用于永磁同步电机的矢量控制算法笔试涉及的通常是对Clarke变换和Park变换的理解。Clarke变换把三相静止坐标系abc变换到两相静止坐标系αβPark变换再旋转到随转子同步旋转的dq坐标系。这两个变换的目的是把交流电机的时变耦合数学模型转化为直流电机式的解耦模型从而能够像控制直流电机一样独立控制励磁分量和转矩分量。如果你投的不是这些岗位方向做不出来FOC和卡尔曼滤波的题是正常的它们本就是岗位筛选用题。但如果你的简历里写了“熟悉信号处理”或“了解电机控制”在这些题上丢分就比较可惜了。6. 考场上的时间分配与做题顺序比刷题更重要的是战术算法笔试和面试不同面试是面试官带着你走一遍思路笔试则完全看你独立解决问题的能力。三年真题刷下来我最深的体会是考场上最大的敌人不是题难而是时间分配不合理。6.1 拿到卷子先做“题型侦察”进入考场后不建议直接从第一题开始顺序做题而是花2-3分钟快速浏览全部题目做题型分类。我把题目分为三类秒杀题比如手写快速幂、求next数组、判断二分图等只要写过类似题目5分钟内能完成。常规题比如BM25计算、堆排序Top K需要10-15分钟规划并写码。压轴题比如综合了数据结构和机器学习的场景题需要25分钟以上的时间。先完成所有秒杀题确保基础分在手再啃常规题最后留时间给压轴题。压轴题不一定要AC写出一条正确的暴力解或部分正确解也能拿到相当比例的分数。我见过太多人卡在压轴题上导致前面的简单题没时间写完这种丢分是最冤枉的。6.2 代码规范与边界条件面试官阅卷的隐藏评分点算法笔试目前大多是线上OJ判题但仍有部分公司采用人工审核代码的方式。这时代码风格会直接影响最终打分。我总结的注意事项包括变量命名清晰宁长勿短。cnt就比c好left就比l好。考试代码不需要简洁需要的是可读。写函数时先做参数校验。比如数组为空、模式串为空、K值大于数组长度这些边界条件都要处理。OJ测试集里边界用例占了很大比例。手写代码时关键位置加注释。人工阅卷中画示意图和写注释的试卷印象分会显著更高。注意数值溢出和除零错误。尤其在做概率、求和、乘法相关题目时先确定数据范围再决定用哪种类型。6.3 复盘比刷题更重要建立自己的“错题知识点树”笔试结束后最重要的不是对答案而是做系统性复盘。我当年备考时保持一个习惯每场笔试结束后把错题和不确定的题按知识点记录每个知识点标注三行——错因、正确思路、类似题。比如某次我做KMP next数组时漏了“失配跳转版和最长前后缀版”的定义差异这个错因被记下后后续每次遇到KMP题我都会先确认题目定义再也没有在这类题上丢过分。第二轮、第三轮复习时直接翻这个错题本效率比重新刷一遍题库高得多。7. 以终为始校招笔试题和实际业务能力的关联笔试题考察的内容在某次面试中被面试官直接问了出来“你笔试里写了卡尔曼滤波能不能讲讲实际项目中如果用IMU和GPS做融合定位你的滤波状态向量会怎么设计”我当时写了基于误差状态的卡尔曼滤波ESKF把姿态误差、速度误差、位置误差作为状态量面试官追问了为什么这样做而不是直接用姿态四元数做状态量。这个问题的答案很能体现笔试知识点和工程能力的差异直接用四元数做状态量姿态协方差的物理意义不明确而且四元数存在归一化约束更新后还要重新归一化而用误差状态误差量天然接近零线性化误差更小协方差的物理含义也清晰。笔试题只考了基础卡尔曼公式面试却考察你能否灵活设计状态量这往往是校招算法工程师筛选的最后一关。所以我要提醒你的是笔试的算法题和面试的系统设计题之间存在一条从“会算”到“会用”的鸿沟。准备笔试时可以大量刷题但不能只满足于AC每做完一道题都想想这个算法在业务中解决什么问题为什么在这里选这个算法而不是其他顺序——这种从“What”到“Why”的思考训练既帮你应付笔试也会在业务面中展现出真正的算法思维能力。我在实际带校招生的过程中发现凡是能在笔试后主动和我聊“这道题在工业界有什么工程变体”的同学后续面试的通过率普遍更高。算法笔试不仅是一张试卷更是你向面试官展示“我如何思考问题”的第一份作品。把每一道题当作一个完整的工程问题来分析、拆解、复盘这个过程本身的价值远超笔试分数本身。
返回列表