news 2026/8/31 14:15:44

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
小红书校招算法笔试解析:从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算法在这套卷子里被专门拎出来考,而且明确给了模式串p="abacaba"作为例子,要求写出next数组。这题看起来简单,但实际上是很多人的失分点,因为next数组的定义在不同教材里是有差异的。

先说这个具体例子。模式串p="abacaba",长度是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加1,next[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^9+7,要求在计算过程中随时取模,而不是等到最后再取。这里的原理是乘法取模的分配律:(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。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/31 14:12:42

基于AI Agent的个性化信息流系统:原理与实战

最近总能在各种技术群里看到类似“算法推荐把我困在信息茧房里了”的吐槽。刷 B 站全是重复的影视解说,打开小红书全是广告软文,油管和推特更是被同质化内容塞满。平台推荐算法的核心目标并不是“让你看到你真正想看的”,而是“让你停留更久”…

作者头像 李华
网站建设 2026/8/31 14:09:23

AI Agent控制硬件设备:用Plumbing Spec构建标准化管道层

在实验室里让 AI 直接操作设备,最让人头疼的往往不是模型选型,而是设备之间五花八门的通信协议。你在 Agent 侧设计得很漂亮,结果到了设备端,有的走 Modbus,有的走 HTTP,有的只能通过串口读数据&#xff0c…

作者头像 李华
网站建设 2026/8/31 14:03:31

Java实现六爻起卦排盘小程序:从随机算法到规则引擎实战

简介:本资源是一套基于Java实现的六爻起卦排盘小程序完整源码,面向对周易文化与编程实践交叉领域感兴趣的开发者、传统文化爱好者及高校计算机专业学生,旨在解决传统六爻占卜手工起卦繁琐、解读门槛高、缺乏数字化工具支持等问题。压缩包共17…

作者头像 李华
网站建设 2026/8/31 14:01:36

STM32+JQ8900公交车报站语音系统设计与实战经验分享

简介:本资源是一个基于STM32F10x系列微控制器的公交车智能语音报站系统完整工程,面向嵌入式初学者与课程设计开发者,解决公共交通场景中自动语音提示、站点精准播报与硬件协同控制等实际问题。压缩包含222个文件,总大小8.45MB&…

作者头像 李华
网站建设 2026/8/31 14:00:51

基于Java的Timeline抽象库:统一Feed、IM与推送的数据流分发实践

简介:这是一份面向中高级Java后端开发者与社交平台架构师的轻量级抽象库,聚焦Timeline模式下的朋友圈、微博类feed流构建、IM实时通讯及消息推送系统开发,解决数据流分发、时序聚合、离线同步与高并发推送等核心难题。资源包共71个文件&#…

作者头像 李华
网站建设 2026/8/31 13:57:37

途虎养车2023秋招算法笔试题解析:从KMP到业务场景

1. 看一份算法笔试卷,先看它在筛选什么 说到“途虎养车2023秋招算法笔试试卷A”,很多准备秋招的同学第一反应是到处找原题、背答案。我做了几年算法工程师,也参与过校招笔试出题和面试,这里先说一个可能不太中听但很真实的话&…

作者头像 李华