
快手2020校园招聘秋招笔试--算法A试卷又是一年秋招季看到不少同学在准备大厂算法岗笔试我翻出自己当年整理的一份快手2020校园招聘秋招算法A试卷的复盘笔记感触挺多。这应该是我见过的大厂算法笔试题里少有的兼顾了“广度覆盖”和“深度挖掘”的一份卷子既要你懂经典数据结构与算法又要你对机器学习、深度学习底层原理有真正理解而不是光会调包。这篇内容不是简单把题目罗列一遍而是围绕“快手算法A试卷到底考什么、为什么这么考、怎么准备才能不白费力气”来拆解。不管你是正在准备秋招的应届生还是打算跳槽的算法工程师都可以对照这份考题背后的考察逻辑看看自己的知识体系有没有漏洞查漏补缺。1. 快手算法A试卷的整体考情与设计思路1.1 算法岗位笔试的定位与筛选逻辑快手的算法岗笔试题目标注为“算法A试卷”这个A并不是随随便便取的编号它对应的是算法工程师这一大类岗位。相比后端开发、测试开发的笔试题算法岗的试卷有明显的筛选倾向不是为了看你会不会写业务代码而是为了看你有没有算法直觉、数学功底和模型理解能力。我当时做完这套卷子的第一感觉是——题量不算大但每一道题都值得琢磨。它不会像一些公司那样堆20道选择题靠题海战术筛人而是用几道“综合题”来考察你建模、推公式、coding的综合能力。这种设计逻辑其实很聪明因为算法岗入职后面对的问题是开放的、没有标准答案的笔试阶段就要筛掉那些只会背题、不懂原理的人。1.2 算法A卷的题型结构与时间压力根据我收集到的信息和周围同学反馈这套笔试卷子大致可以分为三大部分基础数据结构与算法题考察排序、字符串匹配、树和图等经典内容通常有选择题也有编程题主要筛掉基本功不扎实的候选人。机器学习/深度学习理论题考察模型原理、损失函数、优化方法等大多是简答或推导题要求你徒手写公式。综合编程题一般是2到3道完整的coding题要求在限定时间内通过测试用例这是整份卷子拉开差距的关键。时间方面快手当时给的时长大概是120分钟左右。说实话这个时间对于要完成选择和编程题的同学来说并不宽裕尤其综合编程题如果思路卡住很容易影响后面题目的心态。我建议的策略是先快速过一遍所有题目把最有把握的题先拿到分再回头啃硬骨头。2. 处处是坑的经典算法考点2.1 KMP算法与next数组的隐藏陷阱热搜词里有关“在KMP算法中对于模式串p‘abacaba’其next数组”的讨论这个题值得单独拿出来说因为在快手这类大厂的算法笔试中字符串匹配几乎是必考的经典考点而以KMP为载体考察你对next数组的理解是最常见的考法。先说结论模式串p abacaba的next数组求解很多人背了模板依然会错。原因在于不同教材对next数组的定义有差异有的定义为“失配时模式串指针回退的位置”有的定义为“当前字符前面的子串的最长相等前后缀长度”还有的会区分next数组和nextval数组我当时在复盘时专门把这个问题重新推导了一遍。以“最长相等前后缀长度”为定义也就是next[i]表示p[0..i-1]的最长相等前后缀长度next[0]-1i 0: next[0] -1 i 1: 子串 a没有真前后缀next[1] 0 i 2: 子串 ab没有相等前后缀next[2] 0 i 3: 子串 aba前缀 a 后缀 a最长长度 1next[3] 1 i 4: 子串 abac无相等前后缀next[4] 0 i 5: 子串 abaca前缀 a 后缀 anext[5] 1 i 6: 子串 abacab前缀 ab 后缀 abnext[6] 2 i 7: 子串 abacaba前缀 aba 后缀 abanext[7] 3如果你在笔试里遇到这类题我的建议是当场画一个表格把每个位置的前后缀都列出来不要凭记忆跳步。很多同学错不是因为不会KMP而是因为考场紧张看错了定义。注意在做字符串匹配相关的题目时一定要先确认题目中next数组的定义是哪一种不同定义下结果完全不同。这个坑在真实笔试中确实绊倒了不少人。2.2 排序算法不是光会写代码就行另一个高频考点是排序算法热搜词里“数据结构排序算法”“排序算法”“冒泡排序算法C”“堆排序算法”“快速幂算法C”等出现频率都很高。快手的算法笔试卷里排序算法的考法通常有两种选择题形式给出一组数据问你经过某排序算法的第一趟或第二趟后序列是什么样的。代码题形式让你手写快排、堆排或归并排序并分析时间复杂度和空间复杂度。这里我想重点说说堆排序因为它在大厂笔试里出现的频率相当高而且错的人特别多。堆排序的核心是建堆和调整堆很多同学能背出代码但一旦面试官问你“为什么建堆的时间复杂度是O(n)而每次调整是O(log n)”就答不上来了。我当时自己推导了一遍建堆时从最后一个非叶子节点开始向下调整每个节点调整的代价与其高度成正比。底层节点数量多但高度低顶层节点数量少但高度高总的调整次数求和后是O(n)而不是O(n log n)。排序阶段每次从堆顶取走最大值后需要把最后一个元素放到堆顶并向下调整一共n次所以排序部分是O(n log n)。因此堆排序整体时间复杂度稳定在O(n log n)空间复杂度为O(1)。这个推导过程看起来简单但它考察的是你对数据结构的本质理解而不是死记硬背。快手这类公司非常看重这种能力因为实际业务中你不可能永远用现成的库函数遇到性能瓶颈时必须要自己分析数据结构和算法的复杂度。2.3 贪心、动态规划与经典算法图谱在热搜词里“贪心算法”“动态规划”相关的搜索热度一直居高不下而算法A试卷的编程题部分也确实喜欢出这些。贪心算法在笔试中往往会以“你能否判断这道题能不能用贪心”来考察比直接让你写代码更阴险。举个例子区间调度问题可以用贪心按结束时间排序但带权重的区间调度就必须用动态规划。很多同学看到“区间”两个字就默认贪心结果直接掉坑。我在实际面试和笔试复盘时总结了一个经验能用贪心的题一定满足贪心选择性质和最优子结构而动态规划要求的是重叠子问题和最优子结构。考试时如果不确定就先用暴力递归想状态转移方程不要一开始就奔着最优解去。快手算法A的编程题里类似“岛屿数量”“最长递增子序列”“打家劫舍”这类LeetCode中等偏上难度的题出现概率很高。备考时除了刷题更要把“为什么这题是DP状态是什么转移方程怎么来的”想明白这才是笔试能稳定发挥的核心。3. 机器学习与深度学习题目的底层逻辑3.1 机器学习算法笔试的高频理论考点算法A试卷与纯开发岗位的笔试题最大的不同在于它会有相当一部分机器学习相关的理论题。这也是算法岗“算法”二字的正解——不仅要懂数据结构算法还要懂机器学习算法。热搜词里“机器学习算法”“KNN算法的应用能力包括哪三个方面”“XGBoost算法”“聚类算法”等都是高频讨论对象。这类题在笔试卷中通常有两种形式简答/选择考察基本概念比如KNN的三个基本要素、SVM的核函数选择、决策树的划分依据。公式推导给定模型要求你推导损失函数对参数的梯度或者解释某个优化算法的更新过程。KNN那题很有意思“KNN算法的应用能力包括哪三个方面”其实是在问KNN的三个基本要素距离度量、K值选择、分类决策规则。很多人只记得“K近邻”这个名字却忘了这三个要素才是KNN的核心。这类题告诉我们复习机器学习时不能只看模型的名字和调用接口要理解每个模型背后的假设和组成。关于XGBoost笔试爱考的不只是它能比GDBT快在哪里更爱考损失函数的二阶泰勒展开、正则项的设计、以及分裂增益的计算公式。你得能写出来Obj Σ L(yi, yi_hat) Σ Ω(fk)其中Ω(fk)是第k棵树的复杂度惩罚项。XGBoost之所以比传统GBDT效果好就是因为它用了损失函数的二阶导数信息并且把树的结构复杂度显式加入目标函数中这比单纯一阶梯度信息更精细。3.2 深度学习笔试不仅会调框架更要懂底层深度学习部分我记得当时有不少人栽在“反向传播推导”上。现在的学生普遍用PyTorch或TensorFlow函数调一下梯度就出来了但笔试会让你用手推。比如给一个简单的两层全连接网络输入 x - 线性层 W1 - ReLU - 线性层 W2 - 输出让你求损失对W1、W2的梯度。你需要掌握链式法则的展开∂L/∂W2 (∂L/∂output) * (∂output/∂W2) ∂L/∂W1 (∂L/∂output) * (∂output/∂W2) * (∂W2/∂hidden) * ReLU * (∂hidden/∂W1)在推导过程中最关键的是要分清楚矩阵的形状。如果你在纸上把每个变量的维度标出来推导就清晰很多。除了BP推导注意力机制、Transformer结构、BatchNorm的原理也是高频考点。我记得2020年前后Transformer还没有像今天这样在NLP和CV领域全面铺开但快手作为短视频平台对推荐、视频理解算法要求很高笔试中涉及注意力机制也合情合理。3.3 从热搜词看智能优化算法的隐性考点热搜词里出现了一串与智能优化算法相关的热词比如“粒子群算法原理”“模拟退火算法”“KL ELBO算法原理详解”“剪枝算法”等。这些词看起来和快手笔试没有直接关系但恰恰反映了当前算法岗笔试准备中常见的“考点外溢”现象。粒子群算法PSO和模拟退火算法SA属于元启发式优化算法一般在经典算法课程中不会重点讲但如果在简历上写了“熟悉优化算法”或“做过参数调优”面试官和笔试题目就可能冷不丁出现类似“粒子群算法的速度和位置更新公式是什么”的问题。我当时整理这部分时给粒子群算法的核心更新公式做了个总结v_i w * v_i c1 * r1 * (pbest_i - x_i) c2 * r2 * (gbest - x_i) x_i x_i v_i其中w是惯性权重c1、c2是学习因子r1、r2是[0,1]之间的随机数。这个公式用来理解PSO的搜索逻辑粒子飞行方向由自己的历史最优位置和群体的全局最优位置共同决定。这些优化算法虽然不一定是快手笔试的必考题但既然在热搜词里有这么高的热度说明确实有同学在笔试或面试中遇到过。我的建议是以经典算法为主线把这些扩展算法作为“知识图谱”的枝叶去了解不需要花大量时间写代码但至少要能说清楚原理和适用场景。4. 笔试实战策略从审题到AC的完整方法论4.1 拿到试卷后先做什么很多同学拿到笔试邮件登录在线测评系统后第一反应就是从第一题开始按顺序做。这个习惯在算法A试卷中其实有点吃亏。因为这套卷子的题型分布并不完全按照难度递增来排列有时选择题里会藏着很偏的知识点反而编程题最后一题可能是最常规的。我的习惯是前3分钟只做一件事浏览全部题目。在草稿纸上快速记下每道题的类型和初步思路然后按照“好拿分、有把握、分值高”的顺序做题。比如如果一道选择题考的是KMP next数组你平时练过直接做稳拿分。如果一道编程题是“最长公共子序列”这是经典DP脑子里有模板优先做。如果一道简答题让你推导SVM的对偶形式你虽然知道大概但需要时间建议放到后面。笔试不仅是考你会不会更是考你在有限时间内能不能把自己会的东西全部拿到分。4.2 编程题的白板调试技巧算法A试卷的编程题通常是在线OJ形式没有IDE那么友好的调试环境。我刚参加校招笔试时踩过不少坑其中最亏的是代码逻辑没问题但因为输入输出格式不对导致通过率为0。白板编程的核心技巧有几点第一先写输入输出框架再写核心逻辑。不要先写了一个很长的函数到最后发现忘了处理多组输入。很多笔试平台对输入输出的格式要求非常严格比如可能要求读取到EOF或者以某个特殊符号作为结束标志。第二边界条件优先考虑。空数组、只有一个元素、全是相同元素、数值溢出等场景在写核心逻辑之前就想好。经验是能AC的代码往往是考虑了边界条件的代码而不是主流程特别炫的代码。第三大样例推理。代码写完后不要急着提交先在草稿纸上手算一个小的测试用例把代码运行一遍确认每一步的输出符合预期。这个环节看似浪费时间但能帮你拦住90%以上的低级错误。第四不要死磕一道题。如果一道编程题做了20分钟还没有通过先跳过去做其他题最后有时间再回头。笔试评分通常是按通过用例比例算分你只要拿下所有题目50%的用例成绩可能就不差但死磕一道题会让其他题白卷。4.3 公式推导题的时间分配建议算法A试卷里的机器学习推导题往往是拉开差距的地方。以我当时了解的情况很多同学在选择题和编程题上花费了过多时间导致最后推导题只能随便写两行非常可惜。我建议把整份卷子的时间按 “5:3:2” 来分配50%时间给编程题这是拿分的大头。30%时间给机器学习/深度学习理论题毕竟这是算法岗笔试区别于开发岗笔试的地方答得好很加分。20%时间给选择题选择题分值小不要恋战。当然这个比例要结合每个人的情况调整但大方向是不要把选择题当成主战场。5. 备考进阶从一套试卷到一套知识体系的构建5.1 算法数据结构的主干知识图谱做完整套快手算法A试卷的复盘我最大的体会是这套题考察的知识点并不是孤立的而是以“算法设计方法”为主线串联了整个知识体系。我在复盘时做了一张属于自己的知识图谱在这里也分享给读者线性结构数组、链表、栈、队列考的是指针操作和边界处理。树与图二叉树遍历、BST、堆、并查集、最短路径、最小生成树考的是递归和搜索思维。字符串KMP、Trie树、后缀数组考的是对匹配逻辑的精细理解。排序与查找快排、堆排、归并、二分考的是复杂度分析和稳定性判断。算法设计方法贪心、分治、动态规划、回溯考的是问题建模能力。我在准备校招时把LeetCode按这个图谱重新刷了一遍每一类题至少精做30道。刷题的时候不追求数量而是每道题都做到能自己写出完整推导过程这样到了笔试现场看到任何一道题都能迅速把它归类到某个知识节点上。5.2 机器学习与深度学习的复习框架机器学习部分的复习我采用了一个“模型清单”的方法监督学习线性回归、逻辑回归、SVM、决策树、随机森林、GDBT、XGBoost、LightGBM。无监督学习K-Means、DBSCAN、层次聚类、PCA。深度学习CNN、RNN/LSTM、Transformer、Attention机制。每个模型都要回答四个问题模型是什么、假设是什么、损失函数怎么写、怎么优化求解。如果能独立把这四个问题回答清楚笔试里的理论题基本就稳了。比如逻辑回归你需要能写出P(y1|x) 1 / (1 exp(-w·x))损失函数是交叉熵L -[y·log(p) (1-y)·log(1-p)]梯度是∂L/∂w (p - y)·x逻辑回归的梯度形式看起来简单但它其实是很多复杂模型的基础。把这类基础模型的推导练到肌肉记忆考试时就事半功倍。5.3 快手业务场景下的算法考察倾向快手作为短视频平台算法在推荐、内容理解、视频处理等场景中非常核心。这一点在算法A试卷的题目取向上也有体现。比如视频推荐领域常用到的协同过滤、Embedding、用户行为序列建模等概念可能在简答题中出现视频内容理解涉及到的图像分类、目标检测等方向可能以深度学习理论题的形式出现。我在复盘时特别注意到热搜词里“图像锐化的拉普拉斯算法”“图像分类算法”“SOBEL算法”这类图像处理相关的词密度较高说明不少人在准备快手时会特别关注CV方向的考点。虽然算法A试卷不一定会考到SoBel算子这类具体图像处理算法但图像处理的基础知识比如卷积操作、边缘检测、图像金字塔等对于理解视频推荐和内容理解算法很有帮助。建议准备快手算法岗的同学不要只盯着推荐和机器学习也要花一点时间补图像处理和视频理解的基础。6. 校招笔试常见问题与避坑指南6.1 在线笔试系统的那些坑在线笔试和平时在自己电脑上写代码完全不同平台、浏览器、网络都会成为变量。我在这里整理几个真实踩坑的高频问题供你参考常见问题之一代码在本地能跑提交到OJ就编译错误这是因为在线OJ通常使用严格的编译参数或者你本地用的编译器和OJ用的版本不一致。比如本地环境默认支持C11的某些特性但OJ的编译器版本较老不支持。解决办法是写代码时尽量用通用语法除非题目明确说明支持某种新标准。常见问题之二输入输出格式不对很多同学自己测试时用控制台输入很随意到了OJ平台没有按照题目的输出格式要求来做。比如题目要求每组输出占一行如果你的代码只是在最后输出一次那必然错误。解决方法是先看清楚输入输出样例特别是“示例1”、“示例2”的描述。常见问题之三递归爆栈在线OJ通常对递归深度有限制如果题目的递归深度很大比如二叉树退化成了链表递归实现很容易导致栈溢出。笔试时如果题目的数据范围较大优先考虑用迭代或者显式栈模拟。6.2 复习时间不足时的取舍建议如果你现在离笔试只剩一到两周建议按“保底拿分”的原则来复习必得分的部分数组、字符串、链表相关的简单到中等题这些题出现频率高套路固定。重点突破的部分动态规划的经典题模版比如背包问题、最长公共子序列、最长递增子序列。性价比很高的部分机器学习基础逻辑回归、SVM、决策树的概念和推导这些通常在简答题中出现拿分比编程题更可控。可以适当放弃的部分冷门算法红黑树细节、高级字符串算法、极端困难的竞赛题。笔试不是要考满分而是要保证自己在有限时间内拿到足够的分数进入面试。把基础题做对比做出一道压轴题更有价值。6.3 笔试后的复盘比分数更重要的是错题很多同学笔试结束就不管了等结果的时间白白浪费。我建议笔试结束后花一两个小时趁热打铁做一份“笔试复盘笔记”记录以下内容哪些题是自己确定会做但做错的原因是什么。哪些题是蒙对的背后的知识点是什么。哪些题是完全不会的需要专门补强。时间分配是否合理哪些题花的时间过高。我当年在准备校招时把每次笔试的复盘笔记都整理成一个文档到后期面试前就只看这些错题和复盘内容效率远高于重新刷题。经过几次笔试后你会发现自己常犯的错误就那么几类比如数组越界没考虑、DP状态初始化写错、公式推导中符号写反。把这些固定错误逐一消灭笔试成绩就有了根本性提升。6.4 还有一些需要留意的细节除了核心知识笔试中还有一些细节容易被忽略审题要仔细题目中没有多余信息。算法笔试的题干通常字字有用特别是数据范围、输入格式、边界条件这些信息直接影响你选择算法。例如数据范围达到10^5那就基本排除O(n^2)的算法n在20以内可以考虑状态压缩DP或回溯。不要忽略数学基础。算法岗笔试中涉及概率论、线性代数、高数的题目并不少见比如求期望、矩阵特征值、概率分布等。这些知识不会单独出题但会嵌入到机器学习推导和大数据处理中。保持代码和注释的整洁。虽然在线OJ只关心对错但有些笔试平台有“代码回看”功能面试官可能会看到你提交的代码。整洁的代码风格能留下好印象尤其推到你写的变量命名、注释逻辑、分块清晰会让面试官觉得你有工程素养。写在最后回到快手2020校招秋招算法A试卷本身它其实是大厂算法岗笔试的一个缩影扎实的数据结构与算法基本功、对机器学习深度学习原理的真正理解、快速解决编程题的能力三者缺一不可。在刷题和备考的过程中我最大的体会是不要只把目标定在“AC这道题”上而是要透过题目看到背后考察的知识点明白公司为什么要出这道题。算法工程师的核心竞争力不在于背了多少模型、刷了多少题而在于面对一个新问题时能够迅速建模、设计算法、分析复杂度并落地实现的能力。这套笔试考的就是这件事而我后来在实际工作中发现这件事也恰恰是日常工作的常态。