ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

快手算法岗笔试真题解析:从KMP到推荐系统的全面备考指南

快手算法岗笔试真题解析:从KMP到推荐系统的全面备考指南 快手算法岗的笔试一直是校招圈里热度很高的话题尤其是这份2019年春季校园招聘的算法A试卷网上讨论的帖子不少但真正能把它拆开讲清楚的内容其实不多。我自己当年准备校招时把这份试卷反复梳理了好几遍后来也帮不少学弟学妹做过笔试复盘最大的感受是这份A卷并不是一份纯刷题卷它考的东西横跨数据结构、机器学习、深度学习和工程落地更像是给算法工程师日常能力做的一次全面体检。无论你准备的是快手还是其他大厂把这份试卷的考点吃透基本就摸清了算法岗校招笔试的骨架。1. 快手算法A卷到底在考什么1.1 从岗位JD反推考察维度想搞懂一份笔试卷子不能只看题要先看招的是什么人。快手算法岗主要覆盖推荐、搜索、广告、内容理解、风控等方向2019年春招的算法A卷面向的正是这些业务算法岗位。这类岗位的日常工作不是单纯写个排序算法而是要处理海量用户行为数据从数据里找规律、建模型、做策略最后还要上线验证效果。所以试卷设计就会出现三条主线第一基础算法与数据结构这是代码能力的底线考你能不能把思路快速落地成可运行的代码第二机器学习与深度学习基础考你对常用模型、损失函数、评估指标的理解深度第三业务场景思维考你能不能从业务问题抽象成数学问题这是最有区分度的部分也是在牛客、知乎上讨论最多、争议最大的部分。我记得当时很多同学拿到卷子第一反应是“怎么还有推荐系统相关的题”其实这恰恰说明大家把笔试理解窄了。大厂算法笔试不是大学期末考试它考的是“你能否胜任这份工作”而不是“你记住了多少知识点”。1.2 A卷与B卷的定位差异很多人分不清A卷和B卷的区别。简单来说不同试卷对应不同岗位方向A卷更偏算法策略和模型B卷往往更偏工程开发和基础架构。我见过有同学拿着A卷复习纯数据结构结果发现机器学习题占了一大半这就是信息不对等导致的备考偏差。从网上的回忆版来看快手2019春招算法A卷大致有这几类题型选择题考察基础概念和模型细节编程题考察代码实现简答/分析题考察业务理解和方案设计。选择题里容易出现“下列哪个排序算法是不稳定的”“KMP算法中模式串的next数组是什么”这类直接又刁钻的问题编程题则常见动态规划、贪心、字符串处理分析题往往让你设计一个推荐或排序策略并说明评估方式。这个结构放到现在看依然有参考价值。如果你是准备今年校招的同学我建议不要只盯着算法题刷而是要建立一个“数据结构 机器学习 业务方案”三位一体的知识框架然后再针对性地用真题做校验。2. 数据结构与基础算法KMP、排序与那些容易背错的细节2.1 KMP的next数组背模板没用要理解边界说到快手笔试绕不开的一个经典考点就是KMP。热词里就有一个很具体的例子模式串 pabacaba求next数组。这个题看起来简单但每年都有人失分原因不是不会KMP而是next数组的定义在不同教材里不一样。有的教材把next[i]定义为“第i位失配后模式串指针回退到哪里”有的定义为“前i个字符组成子串的最长相等前后缀长度”还有的用-1作为初始标记。定义不同计算结果就不同。比如pabacaba如果按前缀函数来算结果是[0,0,1,0,1,2,3]如果按另一种从-1开始的失配跳转定义结果又会整体偏移。我在帮人复盘时发现很多人不是不会算而是被“next数组到底怎么定义”绕晕了。这里分享一个比较稳妥的应试策略拿到题先看选项或题干给的是哪一套定义如果题干没说明建议用“最长相等前后缀长度”这个最通用的版本然后在草稿纸上手动推一遍不要凭记忆直接写。手动推的时候可以这样操作对模式串的每个位置看它前面所有字符组成的前缀子串找出最长的一对相同前后缀。比如abacaba推到第6位时整个子串是abacab最长相等前后缀是ab长度是2推到第7位是abacaba最长相等前后缀是aba长度是3。这个思路比背代码更可靠。2.2 排序算法不只是会写快排还要会推复杂度排序算法在笔试里的出现方式分三种直接考手写排序代码、给一段排序过程让判断是哪种排序、以及结合稳定性、时间复杂度做选择题。快排在所有排序里出镜率最高但很多人只记得“选一个基准左右分区递归”真到笔试要求分析最坏情况时间复杂度时反而说不清楚快排最坏是O(n²)平均是O(n log n)。我建议把这张表刻在脑子里排序算法平均时间复杂度最坏时间复杂度稳定性额外空间冒泡排序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²)O(n²)稳定O(1)希尔排序O(n log n)~O(n²)依赖步长不稳定O(1)为什么稳定性重要因为实际业务排序往往涉及多关键字。比如先按点击率排序再按发布时间排序如果排序算法不稳定第一轮排序结果可能被第二轮完全打乱。这种考点在笔试里经常包装成“下列排序算法中哪个适合用于多关键字排序”之类的选择题。2.3 贪心与动态规划经典题型的套路化拆解编程题里贪心和动态规划几乎是必考方向。贪心题的精髓是“局部最优能不能推导出全局最优”典型的有活动安排、区间调度、找零钱特定币值下。动态规划则更复杂考的是状态定义、转移方程、初始化条件和遍历顺序四件套。我的经验是笔试中的DP题不会特别偏基本都围绕着最长上升子序列、0-1背包、编辑距离、区间DP这几个母题展开。你不需要背题但需要很熟练地掌握这些母题的状态定义方式。比如最长上升子序列状态dp[i]表示以第i个元素结尾的最长上升子序列长度转移时遍历前面的所有j如果nums[j]nums[i]dp[i]max(dp[i], dp[j]1)。这个套路练熟了遇到变体也能快速迁移。2.4 快速幂、二分与位运算最容易在编程题里“捡分”的小算法这类算法单独出题通常不难但经常作为大题的子步骤出现。快速幂的核心思想是“把指数拆成二进制通过不断平方来减少乘法次数”在计算a的n次方对模取余时非常有用复杂度能从O(n)降到O(log n)。如果笔试要求处理极大数取模快速幂几乎是必用的工具。二分查找看起来简单但很容易在边界条件上翻车。比如while (left right)和while (left right)的区别mid是取左中位还是右中位更新leftmid还是leftmid1这些细微差别在面试和笔试里是最常见的失分点。我的习惯是统一用左闭右开区间配合while (left right)这样最不容易死循环也方便处理“求第一个大于等于目标值的位置”这类问题。3. 机器学习与深度学习A卷里的隐性重头戏3.1 模型对比LR、SVM、树模型的高频考点如果只看热词搜索你会发现机器学习、深度学习、排序算法这些词的热度远超其他内容这其实就是大多数人在准备笔试时的真实困惑到底该复习到多深我的判断是快手这类以推荐为核心业务的公司笔试对机器学习的要求不会停留在“知道模型名字”的程度而是会考你对模型选择、适用场景、优缺点对比的理解。常见考法有逻辑回归LR是线性模型还是非线性模型为什么逻辑回归用交叉熵而不用均方误差SVM的核函数解决了什么问题GBDT和随机森林的区别是什么我建议用“对比法”来复习比如LR和SVM两者都是分类模型但LR本质是概率模型输出有概率解释天然适合做CTR预估这类任务SVM更关注样本到决策边界的最小距离在小样本高维场景下更有优势。再比如GBDT和随机森林随机森林是Bagging思路并行训练多棵树然后投票降低方差GBDT是Boosting思路串行训练每棵树拟合残差降低偏差。这类对比题如果只背结论换个马甲可能就识别不出来了。3.2 评估指标与过拟合一个模型题可以考出三层功力评估指标这部分AUC是绝对的C位。AUC的全称是Area Under the ROC Curve通俗理解就是“随机抽一个正样本和随机抽一个负样本正样本预测值比负样本预测值大的概率”。AUC的优势在于不依赖具体阈值对正负样本比例不敏感所以推荐场景里衡量模型排序能力非常常用。过拟合的考点则更细。L1正则化会把某些特征权重压到0相当于特征选择原因是L1的导数在0点不可导且梯度下降时会产生稀疏解L2正则化只会让权重变小不会产生严格的0。Dropout是深度学习中常用的正则化技巧训练时随机丢弃一部分神经元测试时保留全部神经元并按比例缩放。笔试题经常在“训练时和测试时行为是否一致”上设坑很多人只记得Dropout的机制忘了测试时要乘上保留概率。3.3 聚类与降维无监督学习的常考知识点提到无监督热词里的聚类算法、KNN算法的应用能力是搜索热点。K-Means是最基础的聚类算法笔试常考它的迭代过程随机选K个中心点分配样本到最近中心更新中心点重复直到收敛。要注意K-Means对初始中心点敏感容易收敛到局部最优所以有了K-Means这种初始化优化。KNN则常拿来和K-Means做区分很多初学者会搞混。KNN是分类算法核心思想是“看邻居的标签决定自己的标签”不需要训练过程属于惰性学习K-Means是聚类算法没有标签目标是发现数据内在结构。笔试里这种区分度高的小点恰恰是最容易出选择题的地方。3.4 深度学习基础反向传播与常见网络结构深度学习部分最常考的其实是反向传播和链式法则。题目通常会给你一个两层或三层的小网络给定输入、权重、损失函数让你手动计算某一层的梯度。这类题看着复杂但只要画个计算图一步一步推就不会出错。网络结构方面CNN的卷积核、池化层、感受野概念RNN的梯度消失和LSTM的缓解机制Attention机制的基本思想都是高频考点。热词里出现的强化学习算法、粒子群算法原理也值得留意快手这类平台在内容分发、流量调控中可能用到多臂老虎机、强化学习做探索与利用的平衡所以笔试偶尔会出这类题目考察你的知识广度。3.5 粒子群、模拟退火、PID为什么这些优化算法会出现在搜索热词里搜索热词里出现粒子群算法原理、模拟退火算法、PID算法我推测原因有两个一是有些同学在准备笔试时习惯把各种算法分类整理把这些启发式优化算法归类到“概率与优化”专题里二是部分算法岗位会涉及流量调控、参数调优类问题这些算法在工程上有真实应用场景。粒子群算法的核心是模拟鸟群觅食行为每个粒子有位置和速度通过个体历史最优和群体历史最优来更新自己。模拟退火的核心则是以一定概率接受比当前解更差的解避免陷入局部最优。如果笔试遇到这种题不太可能让你手写完整实现更多是考察思想或者让你对比它和梯度下降的差异。知道它们各自解决什么问题、适用什么场景就够了。4. 推荐系统相关的考察方向从笔试倒推业务能力4.1 为什么快手笔试会涉及推荐知识快手靠短视频起家推荐系统是核心业务的中枢。算法A卷不可能完全脱离业务一定会围绕推荐链路出题。这种题在应届生眼里可能觉得超纲但从公司角度来说非常合理招一个算法工程师进来不是让他刷题的是让他解决推荐、内容理解、用户体验这些真实问题的。我在复盘时发现业务题主要分两类一类是“概念解释型”比如什么是协同过滤、什么是召回和排序的区别另一类是“方案设计型”比如用户冷启动怎么做、如何评估一个新排序模型的效果。后者通常没有标准答案考的是逻辑是否清晰、考虑是否全面。4.2 召回与排序一套经典的评估思路推荐系统的经典架构是“召回 排序”。召回阶段从海量物品中粗选出几百个候选常见方法有基于物品的协同过滤ItemCF、基于用户的协同过滤UserCF、向量召回双塔模型、Item2Vec排序阶段对候选做精细化打分常见模型从LR、GBDTLR到DeepFM、DIN等。笔试如果让你设计一个推荐策略不要一上来就讲深度学习模型而要先讲清楚你的漏斗用什么数据做召回用什么特征做排序模型离线评估用什么指标线上怎么验证。这种“整体感”正是面试官想看到的。4.3 冷启动与特征工程业务题里容易出彩的点冷启动是推荐里最经典的开放问题。新用户没有历史行为协同过滤用不了怎么办常见的思路有用热门内容兜底根据用户注册时选择的兴趣标签做粗粒度匹配利用手机设备信息等上下文特征做冷启动。新物品冷启动则可以用内容特征视频分类、标题文本、封面图建立内容向量再进行相似度召回。这里有个容易忽略的考点AB实验。任何策略上线前都需要评估笔试中可能会问“新模型相比旧模型提升了1%的点击率你怎么判断这个提升是显著的”。你需要知道P值、置信区间、样本量计算这基本概念不需要背公式但要能说出“用双样本假设检验看置信区间是否包含0”这个核心逻辑。4.4 内容理解相关算法拉普拉斯锐化、Sobel、分类模型怎么串起来热词里的图像锐化的拉普拉斯算法、Sobel算法、图像分类算法、工业异常检测算法对应的是内容理解方向。快手有大量视频内容需要算法做封面选取、视频分类、内容标签抽取所以笔试中偶尔会考察图像处理基础。Sobel算子是边缘检测算子通过计算图像梯度幅值来找到边缘区域拉普拉斯算子是二阶微分算子常用来做图像锐化。图像分类模型则是从传统的HOGSVM到现在的CNN系列。如果你投递的岗位偏向内容理解、多媒体算法建议把这些基础算法过一遍如果投递的是推荐、广告方向了解概念即可不需要深入实现。5. 考场实战时间分配、边界条件与防失分习惯5.1 做题顺序先拿基础分再啃硬骨头笔试时间通常有限我的建议是“先做选择题再做编程题最后做分析题”或者说“先把会做的全部做完再做需要思考的”。选择题虽然单选多选混杂但知识点固定拿分确定性最高。编程题如果第一题卡太久果断先写一版暴力解保底拿部分分再考虑优化。分析题不要空着哪怕只写出思路框架也比白卷强。快手这套A卷里我觉得最容易拉开差距的是编程题的边界条件和分析题的完整性。选择题大家基本都会复习到差距不大编程题是“写成什么样”的差距分析题是“能不能想到别人想不到的角度”的差距。5.2 代码细节边界、复杂度和输入输出格式写编程题时边界条件的重要性怎么强调都不过分。空数组、数组长度为1、目标值不存在、负数、溢出、重复元素这些case在笔试判题时几乎必出。我的习惯是写完代码先跑三个case最小规模、一般规模、边界规模。最小规模比如n0或n1边界规模比如全是相同元素或者已经有序的情况。复杂度估算也很重要。笔试题目通常会给数据范围如果你看到n10^5O(n²)的算法基本会超时必须想O(n log n)或O(n)的方案如果n1000O(n²)可能就能过。这种对复杂度的敏感度靠的是平时刷题时的刻意训练而不是考试时临时估算。5.3 刷题策略用真题当镜子而不是当题库考前刷真题是有用的但要注意方法。我见过太多同学把历年笔试真题刷了三遍答案都背下来了可遇到新题还是不会。原因很简单背题是在记忆“这道题的解法”而不是在训练“解决这类题的能力”。正确做法是每做完一道题问自己三个问题这道题的核心考点是什么我为什么一开始没想到如果把题目条件改一下解法会怎么变比如做一道KMP的next数组题不只要会算这道题的答案还要能说出next数组在匹配过程中到底优化了什么以及不同定义下代码应该怎么写。这样练下来才算真正把题变成了自己的能力。6. 从一份真题搭建算法笔试的长期备考框架6.1 以知识带题建立自己的算法知识地图备考算法笔试最忌讳的是零散刷题。我建议先画一张自己的知识地图不需要给别人看自己心里清楚就行。图上至少要有这几个模块基础算法枚举、模拟、排序、二分、双指针、前缀和、数据结构数组、链表、栈、队列、哈希、树、堆、并查集、图、算法思想贪心、分治、DP、搜索、字符串算法KMP、Trie、Manacher、数学快速幂、gcd、质数筛、机器学习基础模型、损失、优化、评估、深度学习基础反向传播、CNN、RNN、注意力。画好地图后每个模块挑3-5道代表作练手覆盖面比数量更重要。热词里出现的堆排序算法、dijkstra算法、快速幂算法c、kahn算法等其实都属于这张地图上的具体节点。你不需要做到每个节点的题都能秒杀但要保证每类题拿到手都有思路而不是凭运气。6.2 笔试和面试怎么衔接同一个知识点两种考法笔试和面试对知识点的考察方式不一样。笔试更看重“你能否在有限时间内算出正确答案”面试更看重“你是否有深度、有逻辑地思考问题”。比如排序算法笔试可能让你手写归并排序面试可能问你“归并排序的额外空间能优化到O(1)吗”后者其实是在考察你是否理解归并的本质是合并两个有序数组。这里分享一个很实用的方法每次复习一个知识点时同时准备它的“笔试版”和“面试版”。笔试版是能画图、能计算、能写代码面试版是能讲原理、能说优缺点、能举业务例子。这样一套知识点准备下来笔试面试都能应对效率也高。6.3 我踩过的坑和调整后的节奏我自己准备算法笔试时走过不少弯路。早期最大的问题是贪多每天刷很多题但缺少总结导致“做一道忘一道”。后来调整为每周只重点攻克一个模块周一到周五每天做2-3道该模块的题周六整理该模块的知识点和错题周日做一次综合模拟。这样坚持一个月后整体稳定性和做题速度都有了明显提升。另一个坑是忽视机器学习基础。我有一段时间把精力全放在刷LeetCode上结果做校招笔试时发现机器学习选择题错了一半这才意识到大厂算法笔试的考察范围远不止数据结构。后来我把机器学习基础重新过了一遍重点复习损失函数、模型评估、正则化这些高频考点正确率才稳定下来。如果你现在离笔试还有一个月以上我的建议是前两周打基础主攻高频考点第三周做真题每天一套控制时间最后一周回归知识点把错的题和模糊的概念补齐。笔试不是比谁刷的题多而是比谁的知识网络更完整、临场更稳定。把快手这份A卷当作起点沿着“基础算法、机器学习、业务思维”三条线去扩展你会发现所有大厂算法笔试的底层逻辑都是相通的。
返回列表