ARTICLE DETAIL

建站实战干货

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

小红书校招算法笔试解析:从KMP到聚类与推荐系统

2026/8/31 14:15:45 拓冰建站 浏览量
小红书校招算法笔试解析:从KMP到聚类与推荐系统 小红书2020校招算法笔试题卷三算是一套在社区里流传比较广的题目。前阵子有学弟准备秋招翻出这套题来问我哪些知识点必须吃透我又把它整体过了一遍。说实话这套卷子的风格很典型不考偏门怪题而是把数据结构、字符串处理、机器学习基础、经典算法设计这些核心能力揉在一起既看你的代码功底也看你对算法本质的理解。对准备算法岗、推荐岗、NLP岗校招的同学来说这套题很有参考价值。这篇博文我就按试卷的考点分布把每一类题目的解题思路、容易踩的坑、以及我实际写代码时的习惯都梳理一遍希望能帮到正在刷题的你。1. 笔试整体结构与考点风向1.1 卷三的题目构成与出题思路先说这套卷子的整体感觉。小红书2020校招算法笔试题卷三题目范围覆盖了字符串算法、排序、机器学习基础、深度学习的常见概念以及几道偏业务的场景题。它不是那种纯粹刷LeetCode就能应付的卷子因为有一部分题目会结合业务场景比如推荐系统里的召回、排序或者图像处理里的基础算子。这意味着你不仅要会写代码还得知道算法在真实场景里是怎么落地的。从出题思路来看这套卷子有几个明显的倾向。第一基础数据结构考察得比较细尤其是字符串相关的KMP算法几乎每年必考而且考的不是背模板而是next数组的推导过程。第二排序算法喜欢让你比较不同算法在特定数据下的表现而不是单纯让你手写快排。第三机器学习部分倾向于考察聚类、KNN这类经典算法的原理和适用场景深度学习部分则集中在损失函数、优化方法、过拟合处理这些高频考点上。还有一个有意思的点这套卷子的算法题里出现了不少“边界情况”的陷阱。比如快速幂的取模问题、KMP的next数组从0开始还是从1开始这些细节如果不提前注意很容易在笔试的时候翻车。后面我会针对这些细节单独展开讲。1.2 算法考点权重分析我把这套卷子里涉及的考点按出现频率和重要性做了个排序方便你确定复习优先级。第一梯队是字符串算法和经典数据结构KMP、堆排序、快速排序这些是重中之重基本属于必考内容。第二梯队是机器学习与深度学习的基础知识聚类算法、KNN、损失函数、优化器这几个概念反复出现。第三梯队是工程场景题集中在推荐系统召回策略、图像处理基础算子上。从复习策略上说如果你时间有限优先把KMP的next数组推导、排序算法的复杂度对比、聚类算法的原理与评估这几个点吃透就能拿到大部分基础分。如果你还学有余力再去准备粒子群算法、模拟退火这类智能优化算法虽然它们在小红书的笔试里不算高频但作为加分项还是值得了解的。我个人的建议是不要只盯着题海要学会总结每一类题的解题框架。比如看到字符串匹配先想KMP看到需要找到最优解的NP难问题可以考虑贪心或者模拟退火看到数据需要分组就往聚类方向想。这种“题目特征到算法选择”的映射关系比单纯刷题有用得多。2. 数据结构与字符串算法的核心解法2.1 KMP算法的next数组推导细节KMP算法在这套卷子里被专门拎出来考而且明确给了模式串pabacaba作为例子要求写出next数组。这题看起来简单但实际上是很多人的失分点因为next数组的定义在不同教材里是有差异的。先说这个具体例子。模式串pabacaba长度是7。我们逐个字符分析。第一个字符a没有真前缀和真后缀的概念所以next[0]通常取-1或者0取决于你用的定义。第二个字符b前面的子串是ab最长相等真前后缀长度是0所以next[1]0。第三个字符a前面的子串是aba最长相等真前后缀是a长度是1所以next[2]1。第四个字符c前面的子串是abac最长相等真前后缀长度是0所以next[3]0。第五个字符a前面的子串是abaca最长相等真前后缀是a长度是1所以next[4]1。第六个字符b前面的子串是abacab最长相等真前后缀是ab长度是2所以next[5]2。第七个字符a前面的子串是abacaba最长相等真前后缀是aba长度是3所以next[6]3。这样算出来的next数组是[-1, 0, 0, 1, 0, 1, 2, 3]如果第一位补-1的话。但如果你用另一种定义next[i]表示当前字符不匹配时应该回退的位置那含义会略有不同。所以考试的时候一定要先看清楚题目对next的定义否则容易满盘皆输。这里有一个实操中的细节我特别想说。很多同学在笔试的时候会临时手写KMP但写到一半容易把next数组的递推逻辑写错。我建议你在准备阶段就把KMP的代码写得非常熟练尤其是失配时回退的循环逻辑。有一个小技巧是在求next数组的时候用一个指针j表示当前已匹配的前缀长度然后依次遍历模式串。如果当前字符匹配j加1next[i]等于j如果不匹配j回退到next[j]的位置直到匹配或者j变为-1。这个写法可以避免很多边界问题。2.2 排序算法选型与手写注意事项排序算法在小红书的笔试里也经常出现。这套卷子虽然没有直接给一道“手写快排”的题目但在选择题或者复杂度分析题里排序算法的比较是少不了的。尤其是堆排序、快速排序、归并排序这几种经典算法的稳定性、时间复杂度、空间复杂度你必须烂熟于心。这里我整理了一个对比表方便你考前快速浏览排序算法平均时间复杂度最坏时间复杂度空间复杂度稳定性冒泡排序O(n²)O(n²)O(1)稳定快速排序O(n log n)O(n²)O(log n)不稳定归并排序O(n log n)O(n log n)O(n)稳定堆排序O(n log n)O(n log n)O(1)不稳定快排最坏时间复杂度退化为O(n²)的情况是每次划分都极端不平衡比如数据已经有序而选取了固定基准。解决方法是随机化选取基准或者取三数取中法。在实际笔试中如果题目要求你手写排序算法我建议优先写清楚快排或者归并排序因为它们的平均性能优秀。写快排的时候要留意递归的终止条件和partition函数的边界处理。我第一次写快排的时候就是在partition返回值那里搞错了导致死循环后来形成了肌肉记忆才彻底解决。还有一个容易被忽视的点就是比较排序的时间复杂度下界是O(n log n)如果题目里出现要求O(n)级别的排序那就要考虑计数排序、桶排序或者基数排序这种非比较排序。小红书的题里也出现过这种思路题目会给你一个特定范围的数据暗示你用桶排序解决。3. 机器学习与深度学习考点拆解3.1 聚类算法的场景与评估机器学习基础这部分聚类算法是高频考点。卷子里提到了“聚类算法”这个热词而且从出题趋势看不仅会问你K-Means的原理还会让你解释不同聚类算法的适用场景。K-Means的核心流程其实很简单随机选择K个中心点然后迭代执行两步第一步把每个样本分配到距离最近的中心点第二步重新计算每个簇的中心点直到中心点不再变化。但真正理解K-Means你需要知道几个关键问题。第一K值怎么选常用的方法是手肘法画出不同K值对应的SSE曲线找到下降趋势明显变缓的拐点。第二初始中心点的选择会影响最终结果所以K-Means的初始化方式在实际中更常用它让初始中心点尽可能分散。第三K-Means对异常值敏感因为均值计算会被极端值拉偏。除了K-Means你还需要了解层次聚类和DBSCAN。层次聚类不需要预先指定K值它通过不断合并或分裂簇来构建树状图。DBSCAN则基于密度能发现任意形状的簇还能识别噪声点。在小红书的场景里提到聚类往往和用户分群、商品类目聚合相关所以结合业务场景来理解这些算法会更有优势。聚类结果的评估也是一个考点。常用的内部指标有轮廓系数Silhouette Coefficient它综合衡量了簇内紧密度和簇间分离度取值在[-1, 1]之间越大表示聚类效果越好。外部指标则需要有标签才能计算比如调整兰德指数ARI和标准化互信息NMI。笔试的时候如果给你一组聚类结果让你判断效果好不好优先想到轮廓系数。3.2 损失函数与优化思路深度学习基础方面这套卷子反复提到损失函数、优化算法、过拟合处理这几个方向。交叉熵损失、均方误差损失是最常见的两个。分类问题用交叉熵回归问题用均方误差这是最基本的搭配。但如果更深一层你需要知道为什么分类问题不直接用均方误差。因为交叉熵配合Softmax可以让梯度更新更稳定而均方误差在Softmax输出接近0或1的时候梯度会非常小导致学习速度变慢。优化器这块SGD、Momentum、RMSProp、Adam这几代优化器的演进逻辑值得梳理。SGD简单但收敛慢且容易震荡。Momentum在SGD基础上引入了动量项可以加速收敛并抑制震荡。RMSProp对每个参数使用不同的学习率自动调整步长。Adam则是Momentum和RMSProp的结合在实际工程中使用最广泛。这里我要提醒一个笔试中容易遇到的坑Adam虽然好用但有些任务里它的泛化性能可能不如SGD配合恰当的退火学习率。这个观察在很多图像分类实验里都出现过。所以如果题目问“为什么有时候SGD效果比Adam好”你要能从泛化性、学习率退火、随机性带来的隐式正则化这几个角度来分析而不是简单回答“Adam更好”。过拟合的常见手段也几乎是必考题。L1/L2正则化、Dropout、早停法Early Stopping、数据增强这几种方法在不同场景下的适用逻辑要能区分。L1正则化带来稀疏解适合特征选择场景L2正则化让权重趋向于较小值是最常用的权重衰减Dropout在训练时随机丢弃神经元相当于集成了多个子网络数据增强则通过增加训练样本多样性来缓解过拟合。4. 高频基础算法题解题思路4.1 贪心与动态规划的选择逻辑基础算法设计题里贪心和动态规划是两大主力。小红的笔试题卷三里也少不了这两类。很多同学遇到一个最优化问题容易纠结到底该用贪心还是动态规划。我分享一下我的判断方法。贪心算法适合“局部最优能推出全局最优”的问题也就是说每一步做当前看起来最好的选择最终结果就是全局最优。经典例子是找零钱问题如果用无限量的硬币面额是整除关系贪心就能得到最优解。但如果硬币面额是任意组合贪心就可能失效。动态规划则适用于问题具有重叠子问题和最优子结构的情况。你不需要每一步做当下最优选择而是通过状态转移方程枚举所有可能的选择保留每个状态下的最优值。典型的例子是背包问题、最长递增子序列、编辑距离。这里有一个我踩过的坑。有一次笔试我遇到一道题看起来可以用贪心我图省事就直接写了贪心解法结果只过了一部分测试用例。后来我意识到那道题存在后效性就是当前选择会影响后续状态所以必须用动态规划。从那以后我遇到最优解问题时会先问自己“当前选择有没有可能堵住后续更好的路径”如果有可能大概率是动态规划而不是贪心。动态规划的难点在状态定义和状态转移方程。我的建议是拿到题先画出递归树看看有没有重复计算。如果有就尝试用备忘录或者自底向上的表格法。状态定义一般是“dp[i]表示前i个元素能得到的...”然后通过最后一个元素的状态转移来推导递推关系。做题多了你会发现很多动态规划题的套路是相似的。4.2 快速幂等数学算法要点快速幂算法在小红书笔试里也出现过。它的核心思想是用二分的方式计算a的n次方时间复杂度从朴素法的O(n)降到O(log n)。原理很简单如果n是偶数a^n (a^(n/2))²如果n是奇数a^n a * a^(n-1)。通过不断将指数减半可以在对数时间内完成计算。写快速幂的时候有两个细节需要特别注意。第一个是取模。很多题目要求的幂结果非常大所以题目会给一个模数比如10^97要求在计算过程中随时取模而不是等到最后再取。这里的原理是乘法取模的分配律(a × b) mod m ((a mod m) × (b mod m)) mod m。第二个细节是处理指数为负数或零的情况虽然笔试里多数是正整数指数但养成习惯总是好的。我用C写一个快速幂的模板方便你参考long long quickPow(long long a, long long n, long long mod) { long long res 1; while (n 0) { if (n 1) { res res * a % mod; } a a * a % mod; n 1; } return res; }这段代码的逻辑是每次循环判断当前指数的最低位是否为1如果是1就乘以当前的a然后把a平方指数右移一位。整个过程把指数按二进制拆解本质上和“将n写成若干2的幂之和”是等价的。笔试的时候只要你理解了二进制拆分的思路即使忘了模板也能现场推出来。类似的数学算法还有GCD的欧几里得算法以及求乘法逆元的扩展欧几里得算法。这些算法虽然简单但在组合数计算、概率题、加密相关题目里会频繁出现建议也顺手准备一下。5. 推荐系统与图像处理场景题5.1 推荐场景下的召回与排序小红书的业务核心是内容社区所以推荐系统的知识在校招笔试里占了不少分量。卷三里也出现了和推荐召回、排序相关的场景题。这类题不会让你写完整的推荐系统但会考察你对召回策略、排序模型、特征工程这些概念的理解。推荐系统一般分为召回、粗排、精排、重排这几个阶段。召回阶段的任务是从全量内容库中快速筛出几百个候选集常用方法有基于物品的协同过滤、基于用户的协同过滤、双塔模型等。排序阶段则对候选集做精细打分常用模型从早期的LR、GBDT到深度学习时代的DCN、DeepFM等。笔试里常考的一个点是召回和排序的区别。曾经有同学问我为什么不能直接用一个深度学习模型对所有内容打分。原因是全量内容数量太大精排模型即使再快也不可能在毫秒级内对所有物品完成推理所以必须先通过轻量级召回快速缩小范围。这个逻辑理解了场景题才能答到点子上。还有一个高频概念是协同过滤。基于物品的协同过滤ItemCF的思路是如果用户A和用户B都喜欢物品X那么A可能也喜欢B喜欢的其他物品。这里的核心是计算物品之间的相似度常用余弦相似度或者皮尔逊相关系数。但ItemCF有一个冷启动问题新物品没有交互记录就很难被推荐出去。解决思路包括基于内容特征的冷启动策略利用物品的文字、图片、标签等属性计算相似度。5.2 图像边界特征的基础算子图像处理相关的考点虽然没有推荐系统那么多但像Sobel算子、图像锐化、拉普拉斯算法这类词也出现在热词里。这说明卷三可能涉及图像特征提取的基础题目或者需要你理解卷积操作的基本原理。Sobel算子是一种离散微分算子用来计算图像灰度函数的近似梯度。它通过两个3×3的卷积核分别计算水平方向和垂直方向的梯度。水平方向的Sobel核是[[-1,0,1],[-2,0,2],[-1,0,1]]垂直方向是[[-1,-2,-1],[0,0,0],[1,2,1]]。把两个方向的梯度幅值组合起来就得到了边缘强度图。拉普拉斯算子则是一个二阶微分算子它不区分方向直接检测灰度突变的位置。常用的3×3拉普拉斯核是[[0,-1,0],[-1,4,-1],[0,-1,0]]或者包含对角线的变体[[-1,-1,-1],[-1,8,-1],[-1,-1,-1]]。拉普拉斯算子对噪声比较敏感所以一般先做高斯平滑再做拉普拉斯检测这个组合叫做高斯拉普拉斯LoG。卷积操作的核心原理在这类题目中属于基础中的基础。你只需要理解卷积核在图像上滑动每个位置做逐元素相乘再求和就得到输出图像的对应像素值。边界部分通常用零填充Zero Padding或者镜像填充来处理。这些概念在深度学习里的卷积神经网络中也是完全一样的理解了基础算子后续看CNN会轻松很多。6. 实战复盘与避坑清单6.1 典型失分点回顾刷这套卷子的时候我总结了一些高频失分点写在这里帮你避坑。第一个失分点是KMP的next数组定义不统一。不同教材、不同选手写的模板next数组的下标起点和含义都不一样。如果你在笔试时照搬某个博主的模板而题目用的是另一种定义很容易出错。我建议你在试卷开头花十秒钟确认题目给出的next定义再动手推导。第二个失分点是排序算法复杂度记忆混乱。尤其是堆排序的空间复杂度很多人误以为是O(n)因为它使用数组存储堆结构。实际上堆排序是原地排序空间复杂度是O(1)。归并排序因为需要额外的临时数组合并才是O(n)。这种细节在选择题里很容易被拿来当干扰项。第三个失分点是动态规划状态转移方程写错边界条件。比如最长递增子序列问题很多人会把dp[i]定义成前i个元素的最长递增子序列长度但正确的定义是以第i个元素结尾的最长递增子序列长度。这两种定义写出来的转移方程完全不一样。边界条件写错整个答案就废了。第四个失分点是场景题回答太笼统。比如问你“如何解决推荐系统冷启动问题”如果你只回答“用热门内容推荐”得分会很有限。更好的回答是分场景展开新用户冷启动可以用热门内容和注册时选择的兴趣标签新物品冷启动可以用物品的内容特征文本、图片、类目计算相似度或者用多臂老虎机策略在探索和利用之间做权衡。这种结构化回答才能体现出算法思维。6.2 备考建议与时间分配最后聊聊怎么备考这类校招算法笔试题。我的建议是把复习分成三个阶段。第一阶段是基础巩固用两周时间把数据结构数组、链表、栈、队列、树、图、字符串算法KMP、Trie、排序算法、二分查找、贪心、动态规划这些核心模块过一遍。这一阶段不追求刷题数量而是追求理解每个算法的原理和适用场景。第二阶段是专项突破针对目标公司的真题风格做训练。比如小红书经常考推荐场景题那么你就需要重点看协同过滤、Embedding、双塔模型这些内容。可以找一些机器学习系统设计的资料来补充场景知识。第三阶段是模拟实战卡着时间做整套真题。我自己的经验是笔试的环境和平时刷题很不一样有时间压力、有页面切换的干扰所以提前适应真实场景很重要。每次模拟完一定要做错题复盘把每道题的知识点、错误原因、正确解法记录下来。这样比漫无目的地刷一百道新题更高效。6.3 写在最后的几点心得我做完这套卷子后的体会是算法笔试到最后拼的其实是对基础知识的熟悉程度而不是会不会几个炫技的骚操作。所谓“熟悉”就是你看到一道题能快速判断它属于哪一类能用最稳妥的方法在规定时间内写出可运行的代码。这种能力没有捷径只能靠长期的刻意练习。另外我也特别想提醒一句笔试只是校招的第一关后面还有面试、项目考察、业务考察。算法题做得漂亮不等于你一定能通过所有轮次。但反过来如果算法基础不扎实连笔试都过不了。所以还是踏踏实实把每一类高频考点的原理吃透再把代码写得又快又稳这才是最靠谱的路径。最后分享一个小习惯。我在刷题的时候会把每一道做错或卡壳的题用一个简单的标签分类记录下来比如“字符串-边界条件”“动态规划-状态定义”“机器学习-概念混淆”。到了笔试前一天我只复习这些标签省时又高效。希望这套方法也能帮到你祝你顺利拿到心仪的offer。