尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

快手2020秋招算法岗B卷:KMP、动态规划与机器学习考点全解析

快手2020秋招算法岗B卷:KMP、动态规划与机器学习考点全解析 站在求职者的角度看快手2020年秋招算法岗的这套B卷其实挺有代表性的。它不像一些公司那样偏爱刁钻的数学证明也不像另一些公司那样几乎全是深度学习模型八股它的题目构成更像是一场“算法基本功工程思维”的综合性体检。我当年刷完这套题之后最大的感受是快手想招的不是只会调包调参的人而是真正能把数据结构、经典算法和机器学习原理串起来解决问题的工程师。这篇文章不讲虚的我把这套试卷的考察重点、每类题目的解题思路以及我当时踩过的坑和复盘心得全部拆开揉碎了分享出来希望能给正在准备大厂算法笔试的同学一些实质性的参考。1. 这场笔试到底在考什么试卷结构与考点分布快手2020校招秋招算法B卷从名字上就能看出来它是面向算法岗位的笔试卷和A卷相比B卷整体更偏向传统算法与数据结构机器学习相关题目的比例没有A卷那么高。整套试卷的题型大致分为三个部分第一部分是选择题考察数据结构、算法复杂度、概率统计等基础概念这部分如果基础扎实基本可以快速拿下第二部分是编程题通常有两到三道考察字符串处理、排序、贪心、动态规划这些核心算法能力第三部分是简答或分析题针对机器学习、深度学习的基础原理进行提问偶尔会让你推导某个公式或解释某个模型的细节。我当时拿到卷子之后先整体扫了一遍发现一个很有意思的特点这套题的难度并不是均匀分布的它在前面的选择题部分设置了几道“送分题”但紧接着就会用一道比较隐蔽的KMP相关题目或者一道需要优化的排序题把节奏拉回来。这种出题方式其实很考验应试者的时间分配能力如果你在选择题上纠结太久后面的编程题就容易时间不够用。从考点覆盖来看这套卷子和当时其他大厂的算法笔试题保持了较高的一致性。字符串匹配算法尤其是KMP、堆排序与快排的变种、贪心策略的证明与实现、动态规划的状态设计以及机器学习中的经典模型原理基本构成了整张试卷的核心骨架。其中KMP的next数组计算和粒子群算法原理这两块是我印象中比较有区分度的考点前者考察的是对经典算法的理解深度后者则是在考察你是否对优化算法有广泛的涉猎。[\text{next}[i] \begin{cases} -1 i 0 \ \max{k \mid 0 k i \text{ 且 } P[0..k-1] P[i-k..i-1]} \text{存在这样的 } k \ 0 \text{其他情况} \end{cases}]这里先把next数组的数学定义摆出来后面展开细说。定义里 P 是模式串P[0..k-1] 是前缀P[i-k..i-1] 是后缀next[i] 的含义是当模式串第 i 位发生失配时指针 j 应该回退到的位置。注意这里 next[0] -1 是一个人为约定的哨兵值表示第一个字符就失配时主串指针需要前进。2. 字符串与匹配类题目KMP与next数组必须拿分字符串匹配是算法笔试的常青树快手这张卷子里也不例外。选择题部分出现了一道关于KMP算法next数组的题目模式串是 abacaba要求计算它的next数组。这道题我当时印象特别深因为KMP算法很多人只记得“怎么用”但对next数组的“怎么推”理解得非常模糊一到考场上要手推具体数值就容易卡壳。2.1 手推next数组的完整过程KMP算法的核心思想可以概括为一句话当发生失配时利用已经匹配的部分信息让模式串尽可能少地回退从而避免主串指针回溯。而这个“已经匹配的部分信息”就是通过next数组预先计算好的。计算next数组的过程本质上是“模式串自己和自己做匹配”的过程。我们以 abacaba 为例下标从0开始逐步推导i0规定 next[0] -1这是边界条件。i1看模式串前1个字符 a。它没有真前缀和真后缀因为真前缀/真后缀的长度必须小于字符串长度所以 next[1] 0。i2看前2个字符 ab。前缀有 a后缀有 b不相等所以 next[2] 0。i3看前3个字符 aba。长度为1的真前缀 a 等于真后缀 a所以 next[3] 1。i4看前4个字符 abac。长度为1时前缀 a 与后缀 c 不等所以 next[4] 0。i5看前5个字符 abaca。长度为1时前缀 a 与后缀 a 相等所以 next[5] 1。i6看前6个字符 abacab。长度为1时前缀 a 与后缀 b 不等长度为2时前缀 ab 与后缀 ab 相等所以 next[6] 2。i7看完整模式串 abacaba。长度为1时前缀 a 与后缀 a 相等等长度为2时前缀 ab 与后缀 ba 不等长度为3时前缀 aba 与后缀 aba 相等所以 next[7] 3。所以最终结果是[-1, 0, 0, 1, 0, 1, 2, 3]。这是一个考得很细的题目因为它不仅考察你知不知道KMP算法是做什么的还考察你能不能精准地写出next数组的每一个值。我当时在做这道题时旁边就有人因为忘记了next[0]-1这个边界条件导致后面所有的值全部错位直接把整道题的分数丢掉了。2.2 一个容易混淆的变体以1为起始下标的next数组这里补充一个常见的坑。有些教材或者网上的博客会以1作为字符串的起始下标来定义next数组这时next[1]0Next[2]1Next[1]1这样的边界值写法会和以0为下标的定义差开一个偏移量。笔试的时候一定要看清楚题目给的模式串下标是从0开始还是从1开始。快手这道题明确用了next[i]的经典定义但其他公司的笔试题可能就会写成“下标从1开始next[i]表示前i个字符组成的子串的最长相等前后缀长度”。两种定义下同一个模式串的next数组数值会不完全相同但核心推导逻辑是一样的。如果你在考场上发现算出来的结果和选项都对不上先检查一下是不是下标定义的问题。我在实际做题时的习惯是先把模式串的字符和下标抄在草稿纸上然后按照“初始化next[0]-1双指针遍历”的方式来推。这样既快又不容易出错。### 2.3 编程题如果考KMP大概率会怎么出选择题考next数组可能还算温和真正麻烦的是编程题里出现KMP。快手当年虽然没有直接考KMP的裸题但有一道字符串匹配的编程题其实是KMP思想的变体给定一个文本串和一个模式串要求找出模式串在文本串中所有出现的位置。如果直接调用语言自带的字符串查找函数比如Python的str.find其实也能做但笔试环境通常会限制你不能用这些封装好的函数或者要求你实现完整的匹配逻辑。如果遇到这种题我的建议是不要自己现场发明一个看似巧妙的双循环暴力匹配方法。暴力匹配的时间复杂度是O(n*m)在文本串长度达到10^5、模式串长度达到10^4的情况下会直接超时。KMP的预处理时间是O(m)匹配时间是O(n)总共O(nm)这个复杂度在大数据量下是可以接受的。写KMP代码的时候还有一个小细节匹配成功之后j要回退到next[j]而不是重新归零这样才能继续找下一个匹配位置。我在答卷上就吃过一次亏当时以为匹配成功就结束了结果题目要求的是“所有出现的位置”导致少输出了一大半结果。这种非技术性的失误在实际笔试中其实非常可惜大家写代码的时候一定要先把题目要求读完整。3. 排序与贪心基本功决定答题速度排序算法和贪心算法在快手这套卷子里占的比例不算低。选择题里有一道关于堆排序调整过程的题目编程题里则涉及到了一个典型的贪心调度问题。这两部分内容看起来是基础中的基础但恰恰是这些基础题最能拉开有充分准备和临时抱佛脚的人之间的差距。3.1 堆排序的调整细节笔试最常见的失分点堆排序这道题考察的是“给定一个初始数组建堆之后取走堆顶元素再调整堆写出调整后的堆结构”。很多人对这个过程的记忆是模糊的知道堆排序是利用大顶堆或小顶堆来进行排序但真让你手写建堆和调整的每一步就容易出错。我当时在考卷上遇到的是一个初始数组建大顶堆的问题。建堆的过程不是从数组的第一个元素开始的而是从最后一个非叶子节点开始自底向上地执行下沉操作。这个“自底向上”的顺序是很多人容易忽略的关键点。如果你从根节点开始往下调整会导致局部调整结果被后续的兄弟子树调整覆盖最终得到错误的堆结构。具体来说假设数组长度为n最后一个非叶子节点的下标是 n/2 - 1下标从0开始。从这个节点开始向前遍历每个节点对每个节点执行下沉操作。下沉操作的核心逻辑是比较当前节点和它的左右孩子如果孩子中有比当前节点大的大顶堆场景就把最大值和孩子交换然后继续向下调整直到叶子节点或者当前节点比所有孩子都大。而“取走堆顶元素之后的调整”则是另一个经典场景把堆顶元素和最后一个元素交换堆的大小减一然后从新的堆顶开始执行一次下沉操作。这个过程只需要一次下沉时间复杂度是O(log n)。这个“一次下沉”的细节在选择题里经常被拿来设置干扰项有的选项会让你误以为需要对多个节点进行调整。3.2 贪心算法的题目思路与正确性直觉编程题里那道贪心调度问题我印象里是一个“会议室安排”类的变体给定若干个任务的开始时间和结束时间问最多能安排多少个互不冲突的任务。这道题的标准解法是按照结束时间排序然后贪心地选择结束时间最早且不与已选任务冲突的任务。选择结束时间最早的任务能保证后面留下尽可能多的空余时间从而容纳更多的任务。这个思路本身不复杂但笔试题的难点往往在于输入数据的规模。如果任务数量达到10^5这个量级O(n log n)的排序加O(n)的遍历是必须的如果你用了O(n^2)的双重循环来检查冲突大概率会超时。我当时还想到一个更隐蔽的坑如果两个任务的结束时间相同应该优先选择开始时间更晚的那一个因为这样能进一步减少对后续任务的时间占用。虽然这个优化在“最多能安排多少任务”这个目标下并不影响最终数量但在某些变体中可能会影响方案的具体输出。笔试时如果题目要求输出“安排的任务编号列表”而不是单纯的数量那这个细节就必须考虑进去了。我在准备笔试的时候反复提醒过自己贪心算法最怕的不是想不出贪心策略而是想不出“正确”的贪心策略。有的题目看起来可以用贪心但实际上必须用动态规划才能得到全局最优解这种“贪心动规之争”在笔试中几乎是必考的思维辨析点。3.3 快速排序与快速幂手写代码的隐藏要求除了堆排序快速排序也是笔试中的常客。这套卷子的选择题里虽然没有直接考快排的代码实现但在编程题的数据规模和复杂度要求下如果你写的是冒泡排序基本就告别这道题了。这里想特别提醒一下快排在处理有序数组时如果选择固定位置的基准值比如每次都选第一个元素复杂度会退化到O(n^2)。为了避免这种情况笔试中写快排时可以选中间位置的元素或者随机选一个元素作为基准。虽然考场上不太可能用随机数生成器但选中间元素作为基准是一个稳定且安全的做法。另外说到快速幂算法这个考点在热搜词里也出现了很可能是因为它经常和“求余”操作一起出现在大数计算的场景中。比如让你计算 a^b mod m其中 a、b、m 都可能达到10^9甚至更大。如果用循环逐一相乘O(b)的时间复杂度是完全不可接受的。快速幂的核心思路是利用二进制的思想把指数 b 拆成二进制表示然后通过对底数进行反复平方来减少乘法次数时间复杂度降到O(log b)。我在笔试中遇到快速幂时通常会先写成递归形式再优化成迭代形式这样既能保证思路清晰又不容易出错。[\text{快速幂核心递推} a^b \begin{cases} (a^{b/2})^2, b \text{ 为偶数} \ (a^{(b-1)/2})^2 \cdot a, b \text{ 为奇数} \end{cases}]4. 算法设计与优化动态规划、快速幂与粒子群原理这一部分我想重点聊聊这套卷子里让我觉得比较有区分度的几个考点。它们不全是传统的数据结构题有些其实是优化算法和机器学习基础的交界地带。如果你只是埋头刷LeetCode可能不会刻意去准备这些但如果你的目标是算法岗这些恰恰是面试官希望在笔试阶段就看到你有所积累的地方。4.1 动态规划的状态设计思路动态规划在快手这套卷子里主要以选择题的形式出现但它考察的不是“你能不能默写出某个经典DP的状态转移方程”而是“给定一个新的问题你能不能设计出正确的DP状态和转移”。这种考察方式在笔试中比默写更难因为它要求你真正理解DP的本质。我拿到一道DP题时一般会先问自己三个问题第一状态是什么怎么表示第二转移是什么从哪些状态可以转移到当前状态第三边界条件是什么初始值怎么设置举个例子如果题目是“给定一个数组求最长递增子序列的长度”那么状态dp[i]可以定义为“以nums[i]结尾的最长递增子序列的长度”转移就是dp[i] max(dp[j] 1) 其中 j i 且 nums[j] nums[i]边界条件是dp[i]至少为1每个元素本身可以作为一个长度为1的递增子序列。这是经典的O(n^2)解法。但如果数据规模达到10^5就需要使用贪心二分的优化思路维护一个tails数组来记录长度为len的递增子序列的最小结尾元素。这个优化思路在笔试中也是一个常见的考察点因为题目不会直接告诉你“请用O(n log n)的方法”但数据范围会逼着你往这个方向想。4.2 粒子群算法原理为什么它出现在算法B卷里听到“粒子群算法”这个名字很多人可能会觉得陌生因为传统的数据结构笔试中很少考到它。但快手作为一家内容推荐为核心业务的公司对优化算法的考察是有一定偏好的。粒子群算法Particle Swarm Optimization, PSO是一种基于群体智能的随机优化算法它模拟鸟群觅食的行为通过个体之间的信息共享来寻找全局最优解。在机器学习领域PSO常被用来进行特征选择、神经网络权重初始化和超参数搜索等任务。这套卷子里关于粒子群算法的题目我记得大概是给出一个简单的适应度函数要求解释粒子的速度和位置更新公式。这个知识点其实并不难但如果你没有接触过群体智能优化算法看到那几个公式就会一头雾水。粒子的速度更新公式是v(t1) w * v(t) c1 * r1 * (pbest - x(t)) c2 * r2 * (gbest - x(t))位置更新公式是x(t1) x(t) v(t1)。其中w是惯性权重c1和c2是加速常数r1和r2是[0,1]之间的随机数pbest是粒子自身的历史最优位置gbest是整个群体的历史最优位置。理解这个公式的关键在于拆分它的三个组成部分。第一项w * v(t)是粒子的“惯性”表示粒子保持之前运动趋势的倾向让粒子在搜索空间中继续朝原来的方向前进。第二项c1 * r1 * (pbest - x(t))是“个体认知”部分表示粒子被自己过去找到过的最优位置所吸引。第三项c2 * r2 * (gbest - x(t))是“社会认知”部分表示粒子被整个群体共享的最优位置所吸引。三个部分共同决定了粒子在搜索空间中的飞行轨迹。当时在考场上看到这道题我其实是有点庆幸的因为在此之前我刚好看过粒子群优化的几篇科普文章知道它的核心思想是“个体经验群体经验”的平衡所以即使公式的系数记得不是特别精确也能根据直觉把大致的更新逻辑描述出来。这里想对那些目标是算法岗的同学说一句不要只盯着深度学习和经典数据结构看群体智能、进化算法这类传统优化方法在推荐系统、广告投放、风控建模等真实业务场景中仍然有广泛的应用。大厂笔试试卷偶尔出现这些考点本质上是在试探你的知识广度。5. 机器学习与深度学习算法算法岗笔试的隐藏重头戏这套卷子虽然在命名上称为“算法B卷”但机器学习相关的内容依然是不可忽视的重头戏。我当时预想的是传统算法和数据结构大约占70%机器学习大约占30%但实际上机器学习相关题目占比可能更高一些。这可能也反映了快手招聘算法岗的核心诉求作为一家以人工智能为核心驱动力的公司它需要的不仅仅是能写好排序算法的人更需要能理解模型原理、能处理实际业务数据的人。5.1 KNN算法的应用能力三个核心方面关于KNN算法的应用能力有一道选择题考察了KNN的三个方面分类、回归和异常检测。很多人对KNN的理解停留在“分类算法”这一层但实际上KNN可以做回归做法是找到K个最近邻然后取它们的平均值或加权平均值作为预测结果KNN也可以做异常检测做法是计算每个样本到其K个最近邻的平均距离如果这个距离显著大于其他样本的平均距离就认为该样本可能是异常点。这个知识点之所以频繁出现在笔试中是因为它考察的是“对经典算法本质的理解”而不是“会不会调用sklearn的KNeighborsClassifier”。如果你在简历上写了“熟悉机器学习算法”却不知道KNN的三种应用场景面试官一定会对你的基础产生质疑。5.2 聚类算法与K-Means的隐含假设聚类算法也是这套卷子里的考点之一。我记得有一道题问K-Means算法的核心步骤和它的局限性。K-Means的核心步骤是随机初始化K个聚类中心然后迭代执行“分配”和“更新”两个步骤直到收敛。“分配”是把每个样本划分到距离它最近的聚类中心所在簇“更新”是重新计算每个簇的质心即簇内所有样本的均值。K-Means的局限性则体现在几个方面第一它对初始聚类中心敏感不同的初始化可能导致完全不同的聚类结果因此通常需要多次运行并选择最优结果第二它假设簇的形状是凸的无法处理非凸形状的簇第三它对异常值敏感因为均值会受到异常值的影响。当时我还在答案里补充了一个细节K-Means算法的迭代过程并不能保证收敛到全局最优解它只能保证收敛到局部最优解。这个特性和其他基于贪心或坐标下降的优化算法是一样的。这些细节如果只靠背八股文很容易遗漏但如果你自己动手实现过K-Means算法就会对它有更深刻的理解。5.3 深度学习与反向传播的计算深度学习的考点集中在反向传播和梯度计算上。有一道题给出了一个非常简单的两层神经网络输入维度是2隐藏层维度是3输出维度是1激活函数使用Sigmoid要求计算某个特定参数在某个输入样本下的梯度。这道题考察的不是“能不能用PyTorch自动求导”而是“能不能手工推导反向传播公式”。我当时拿到这道题老老实实地把前向传播的每一步都写在草稿纸上包括线性变换的结果、激活函数作用后的结果、损失函数的值然后再按照链式法则从输出层往回一步步计算梯度。这个过程非常繁琐但如果你平时没有做过类似的推导练习考场上基本不可能临时算出来。我建议准备笔试的同学在复习时至少手工推导一遍两层神经网络的反向传播把“链式法则”在神经网络中的具体表现形式彻底搞清楚。手工推导反向传播时有一个小技巧先画出计算图把每个节点的输入输出都标注清楚然后把计算图“反过来”从输出端逐步往回推。这个可视化方法能极大地降低出错概率。我当时就是用这种方法在两页草稿纸上完成了推导最后还留出了检查的时间。6. 代码实现与笔试环境容易丢分的隐性环节笔试不只是在考你会不会做题也在考你在规定时间、规定环境下能不能稳定输出可运行的代码。快手2020年秋招的笔试是在牛客网平台上进行的可以选择的编程语言有C、Java和Python。我选的是C因为当时觉得C在算法题中的执行效率更高而且STL库里的容器和算法能节省很多编码时间。6.1 输入输出格式最容易被忽视的送命题我们在本地练习的时候往往习惯了LeetCode这种“只需要写函数体”的在线评测模式。笔试中很多时候是需要自己处理标准输入输出的尤其是牛客网这类平台题目会给出一个输入描述要求你从标准输入读取数据再把结果打印到标准输出。这个转换过程看着简单但很容易出错。举个例子如果输入的第一行是一个整数n表示数组长度第二行是n个用空格分隔的整数。在C中我习惯用cin循环读取在Python中则用input().split()。如果你没有养成这个习惯在笔试时可能会把输入格式理解错导致整个程序的逻辑都对但数据读不进来。更常见的坑是输入中有多组测试用例需要在while循环中读取直到文件结束有些同学不知道EOF判断的写法结果只能处理一组数据得分直接减半。我当时特别注意了这个问题在笔试前专门练习了牛客网上各种输入输出模式的题目。这里分享一个小技巧对于“多组测试用例直到文件结束”的情况C可以写成while (cin n)Python可以写成while True try/except或sys.stdin.read()分段解析。把这些模板代码提前准备好考试时可以直接复用能节省不少时间。6.2 复杂度预估与并查集等数据结构的选用笔试中的编程题数据范围往往暗示了期望的时间复杂度。如果你的解法是O(n^2)而数据范围是10^5那么即使代码逻辑完全正确也会因超时而无法通过全部测试用例。我做完一道题后通常会先看一眼数据范围倒推一下应该使用什么复杂度的算法再决定怎么写代码。快手这道卷子里的编程题有一道涉及到了并查集结构。那道题的背景大致是网络连接或社交关系问题需要判断两个节点是否处于同一个连通分量中。并查集在未优化的情况下find操作的时间复杂度是O(n)最坏情况会退化成一条链但加上路径压缩和按秩合并优化后单次操作的时间复杂度可以降到接近O(1)反阿克曼函数级别。如果你知道要使用并查集但不知道优化方法在大规模测试用例下依然会超时。这个细节在准备时是需要额外留意的。路径压缩的直观理解是在查找一个节点的根节点时把路径上遇到的所有节点直接连接到根节点上这样下次再查找这些节点时就只需要回溯一步了。按秩合并的直观理解是总是把高度较小的树合并到高度较大的树下面避免树变得过高。两个优化同时使用并查集的平均性能非常优秀。7. 复盘与准备建议往届视角的几点体会考完快手这套B卷之后我做了一次比较完整的复盘把错题和犹豫过的题目都重新过了一遍。这个复盘过程对我的帮助非常大因为笔试题目本身只是一个结果真正有价值的是你在准备过程中建立起来的算法知识体系和解题思维方式。7.1 时间分配策略别在一道题上死磕我当时的做题策略是先把所有题目快速浏览一遍标记出自己一眼就能看出思路的题目优先解决它们。然后回过头来处理那些中等难度的题目每道题给自己设定一个时间上限如果到了时间还没有思路就先跳过最后再回头啃硬骨头。这个策略能确保你在有限时间内拿到尽可能多的分数。具体来说选择题的时间分配可以控制在每题2分钟左右如果超过5分钟还拿不准先标记跳过。编程题的时间分配是每道题30到40分钟包括读题、思考、写代码和简单测试。这样算下来整套试卷大概能有10到15分钟的富余时间用来检查和弥补前面跳过的题目。7.2 一个容易被忽视的高频考点KL散度与ELBO热搜词里出现了“kl elbo 算法原理详解”这其实也是算法岗笔试中一个比较常见的考点尤其是当题目涉及到变分推断或生成模型时。KL散度Kullback-Leibler Divergence用于衡量两个概率分布之间的差异但它不是对称的即KL(P||Q)不等于KL(Q||P)因此它不是一个距离度量。ELBOEvidence Lower Bound证据下界则是变分推断中的核心概念它通过最大化ELBO来间接最大化对数似然。如果你往年的真题刷得足够多你会发现这类考点在字节、腾讯、快手的笔试中都有出现。它考的不是你能否完整推导出变分下界公式而是你对概率模型优化思路是否有直觉性理解。我当时复习这一块时把自己代入到“设计一个推荐系统的召回模型”这个场景中假设我需要用变分自编码器来学习用户兴趣的隐变量分布这时理解ELBO就不再是死记公式而是有实际意义的建模过程了。7.3 准备算法笔试的资料与方法建议我个人的准备路线分为三个阶段。第一阶段是系统复习数据结构与经典算法参考书目是《算法导论》的经典章节和《剑指Offer》上的典型题目第二阶段是刷题LeetCode的Hot 100和中高频题目基本都要过一遍同时配合牛客网上的历年大厂笔试真题进行模拟训练第三阶段是专项突破针对自己薄弱的环节比如动态规划、字符串匹配等进行集中训练。这里特别想强调一下“模拟笔试”的重要性。很多同学在LeetCode上刷题时可以花一个小时慢慢思考这在平时没问题但笔试的时间限制是非常严格的平均每道编程题只有30到40分钟。我在考前两周每周至少做两次完整的模拟笔试严格按照正式考试的时间来计时。刚开始的时候我几乎每次都会出现时间不够用的情况但经过三四次模拟之后我对每类题目的“时间感知”就变得非常敏锐了知道什么题该花多长时间什么题应该果断放弃。最后再说一个心态层面的建议。算法笔试中遇到不会做的题是非常正常的毕竟大厂的筛选率就摆在那里一张卷子做完能拿到60%到70%的分数已经是一个不错的成绩。考场上最重要的是保持冷静把会做的题目全部做对把能拿的分一分不丢。我见过太多同学在考场上因为一道题卡住心态崩溃导致后面原本会做的题目都做错了。这套快手B卷虽然已经过去几年但它考察的算法基础和思维方法直到今天依然是算法岗位笔试的核心逻辑。希望我的这些经验能帮你在未来的笔试中少走一些弯路。
返回列表