ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

小米校招算法工程师笔试题全解析:从KMP到机器学习

小米校招算法工程师笔试题全解析:从KMP到机器学习 1. 拿到这套题先看整体战局去年秋招季帮学弟做模拟面试辅导翻出这套小米2020校招算法工程师笔试题时第一反应是这题出得挺讲究。不是那种靠偏难怪题刷存在感的卷子而是每一道题都在悄悄考察你能不能干活。我花了三个晚上把整套题重新做了一遍又对照了当年上岸的同学的回忆版答案今天把这份拆解完整写出来。先给一个整体判断这套笔试题的难度属于中等偏上但不过分覆盖范围集中在数据结构、经典算法、机器学习基础三大块外加一部分工程向的思维题。如果你在LeetCode上能稳定刷掉中等难度题且对常见机器学习模型的推导有基本概念那么这套题的及格线是够得着的。但想拿高分需要在手写代码的严谨性和模型原理的深度理解上多下功夫。我当年辅导过的学生里有个很有意思的现象有些人平时刷题量很大但这套题做下来分数并不理想。原因不在于题目难而在于这套题特别擅长找出只会背模板、不懂变通的人。它的考察思路和牛客网上那些拼手速的题不太一样更看重你面对一个具体问题时能不能快速定位到正确的算法模型并且把边界条件处理干净。题型分布大致如下题型分类占比核心考察点数据结构与基础算法约35%字符串匹配、排序变种、链表操作经典算法模型约25%贪心、动态规划、回溯的识别与实现机器学习原理约25%模型推导、损失函数、优化方法工程与思维题约15%复杂度分析、方案设计、异常处理这个分布本身就说明了问题小米算法工程师的定位不是纯研究型而是能落地、能调优、能理解业务数据的工程型算法岗。所以笔试里机器学习部分不会让你手推复杂的证明但一定会问到你为什么这样设计这个公式的每一项在做什么。整套题的时间通常是90到120分钟题量大概在10到15道之间包括选择题、简答题和两道左右的手写代码题。如果你在选择题上纠结太久后面的大题一定会很赶。我自己的经验是选择题单题最多2分钟超过这个时间就标记出来跳过先把能拿的分全部都拿住。2. 基础算法题别被经典两个字骗了这套题里最扎眼的一类就是热搜词里反复出现的在KMP算法中对于模式串pabacaba其next数组这种题。很多人看到KMP就头皮发麻其实KMP恰恰是那种理解了就不难、不理解就永远背不下来的算法。这类题在笔试里成了区分度最高的题目之一很多人选择题全对栽就栽在KMP的填空题上。2.1 KMP的next数组死记硬背的人永远吃亏先把这个具体例子讲透。模式串pabacaba要求next数组。这里有个大坑不同教材对next数组的定义有微妙的差异有的从0开始即next[0]-1或next[0]0有的从1开始有的定义是最长相等前后缀的长度有的定义是最长相等前后缀长度减1。我按国内数据结构教材最常用的定义来解next[i]表示当第i位匹配失败时模式串应该回溯到的位置。具体求法是通过递推利用已经算出的next值向前回溯。对于pabacaba下标从1开始记很多教材这么写手动推导过程如下i1字符anext[1]0约定俗成i2字符b前缀a与后缀b不相等next[2]1i3字符a前缀ab与后缀ba不相等但前缀a与后缀a相等next[3]1i4字符c前缀aba与后缀bac不相等next[4]1i5字符a前缀abac与后缀acba不相等next[5]1i6字符b前缀abaca与后缀acab不相等next[6]1i7字符a前缀abacab与后缀abaca不相等next[7]1等一下这个结果看起来太单调了不符合我印象中这道题的陷阱感。让我重新想一想。实际上求next数组的标准做法是看前缀而不是看后缀。next[i]的定义是模式串中前i-1个字符组成的子串中最长相等前后缀的长度有些教材的定义是最长相等前后缀长度1或-1。为了严谨我用最经典的严蔚敏版《数据结构》教材的定义next[i] 前i-1个字符组成的前缀子串中最长相等前后缀长度1。按这个定义对于pabacabai1next[1]0i2前1个字符a没有真前后缀next[2]1i3前2个字符ab最长相等前后缀长度为0next[3]1i4前3个字符aba最长相等前后缀为a长度1next[4]2i5前4个字符abac最长相等前后缀为0next[5]1i6前5个字符abaca最长相等前后缀为a长度1next[6]2i7前6个字符abacab最长相等前后缀为ab长度2next[7]3这样才对中间出现了next[4]2和next[7]3这样的起伏才能检验考生是否真的理解最长相等前后缀这个概念而不是背一个固定数组。实际手算时的技巧是不要硬看整个串而是先写出每个位置的最长相等前后缀长度再加1。这里我给大家总结一个规律KMP的next数组考题出题人最爱的模式串往往带有重复前缀。比如abacaba就有aba这个重复前缀。你只要抓住前缀和后缀相等这个核心逐位扩展就能算出来。如果笔试时间紧张还有一个偷懒的方法后缀aba与前缀aba相等所以最后的next一定不会太小心里先有个预期。2.2 排序算法变种题不是背个快排就万事大吉热搜词里数据结构排序算法和排序算法反复出现说明排序是这类笔试的送分题和扣分题并存的地方。选择题常考堆排序建堆过程、快排最坏时间复杂度、归并排序空间复杂度。这套题里有个很典型的问题对一个几乎有序的数组哪种排序算法效率最高答案是插入排序这个坑在于很多人条件反射选快排。原因很简单插入排序在序列基本有序的情况下内层循环几乎不进入时间复杂度接近O(n)。快排则因为基准值选取的问题在近乎有序的数组上反而可能退化到O(n^2)。类似的反直觉考点还包括求第K大的数用快速选择快排分区思想平均O(n)而不是先排序再取值O(n log n)。我在实际刷题和面试中发现大厂笔试的排序题很少直接让你手写快排而是喜欢把排序算法揉进一道具体的场景题里。比如给你一个数据流要求实时维护中位数这其实就是双堆问题——一个大顶堆存较小的一半一个小顶堆存较大的一半插入时先在两个堆之间做平衡取中位数时看堆顶。这种题背后的排序思想比裸写十种排序算法更值得花时间准备。2.3 手写链表题边界条件是分水岭这套题的手写代码部分大概率会有一道链表相关的题因为链表题最适合考察指针操作、边界处理和代码整洁度。常见的有反转链表、合并有序链表、链表是否有环、删除倒数第K个节点等。以反转链表为例很多人代码能写出来但问他如果链表长度为1会不会出问题就卡壳了。优秀的答卷要能体现出防御式编程的思路。我的建议是做题时先画一遍节点指向的变换过程再用哑节点dummy node简化头节点的特殊处理最后单独验证空链表和单节点链表。这里分享一个我自己复盘时总结的链表题自检清单空链表处理了吗头节点会变吗变了之后有人接住吗循环结束条件用的是cur ! null还是cur.next ! null哪个才是对的断链的时候还有没有别的方式能访问到那个节点每一条都是真实面试扣分点。套题里如果出现链表相关的代码题能把边界条件写清楚至少能比同龄人多拿20%的分数。3. 机器学习与数学题决定你水平上限的分水岭如果说数据结构部分是基础分那机器学习与数学部分就是拉分项。算法工程师的笔试和纯后端开发笔试最大的不同就在这里——不光考你会不会写代码还考你懂不懂模型背后的数学原理。热搜词里出现了粒子群算法原理、模拟退火算法、强化学习算法、KL散度ELBO算法原理、聚类算法、KNN算法等这些在小米的笔试中都有可能出现。3.1 优化算法家族不仅是在考你记不记得公式我见过很多人准备这类题的方法是背公式比如粒子群算法的速度更新公式。但真正会出题的人考的是你对群体智能思想的理解。举个例子一套题里出了这样一个简答题简述粒子群算法与梯度下降法在求解最优化问题时的本质区别。这个问题的核心在于梯度下降法是确定性算法利用目标函数的梯度信息进行迭代而粒子群算法是随机搜索算法通过个体历史最优和群体历史最优的引导在解空间中进行启发式搜索。前者对函数的可导性有要求后者几乎不依赖函数的解析性质。实际工作中当你需要优化的目标函数是一个复杂的黑盒比如仿真系统返回的性能指标梯度根本无法计算时粒子群这类无梯度优化方法就派上了用场。答题时如果能结合这个实际场景分数会明显高于单纯复述公式。我在面试候选人时最怕听到的就是粒子群就是模拟鸟群找食物后面就没了。能把个体认知和社会认知两个系数通常记为c1和c2的取值对搜索行为的影响讲清楚才算真正理解了这个算法。3.2 损失函数与模型推导为什么这样设计这套题里还有一类高频考点就是为什么用交叉熵而不用均方误差做分类损失。这是个经典问题考察你对损失函数本质的理解。核心答案有两点第一从概率视角看交叉熵来自最大似然估计。对于分类问题模型输出的是类别概率分布交叉熵衡量的是预测分布与真实分布之间的差异它天然适合概率输出。而均方误差假设误差服从高斯分布这更适合回归问题。第二从优化角度看交叉熵配合Softmax其梯度形式在错误分类时幅度较大学习效率高而均方误差配合Sigmoid时当输出接近0或1时梯度会趋近于0导致学习速度极其缓慢。这里可以用一个简单的推导来加深理解Softmax交叉熵损失对logits的梯度是(p_i - y_i)形式简洁且不会出现梯度消失而MSESigmoid的梯度中包含Sigmoid的导数项σ(z)当z很大或很小时这个导数接近0梯度消失问题非常明显。这个考点在笔试题里出现的频率极高值得你用一整页纸来深度准备。我还建议你把偏差-方差分解L1和L2正则化的区别过拟合的解决方案这些问题也一起准备它们经常在同一套笔试题里出现。3.3 聚类与KNN基础但容易答得肤浅热搜词里单列了聚类算法、knn算法的应用能力包括哪三个方面这两个都是机器学习基础题。你以为简单但想拿满分不容易。KMeans聚类的高频考点包括初始中心点选择对结果的影响以及KMeans的改进思路K值的选择方法肘部法则、轮廓系数KMeans的假设各簇方差相近、凸簇结构对离群点敏感与高斯混合模型GMM的对比——GMM允许簇为椭圆形状KMeans实际是GMM的一种特例协方差矩阵为单位矩阵乘以同一常数KNN的高频考点则集中在距离度量方式欧氏距离、曼哈顿距离、余弦相似度、K值的选择K太小易过拟合K太大易欠拟合、特征缩放的重要性KNN基于距离计算如果不做标准化量纲大的特征会主导距离、以及KD树和球树这些加速方法。我建议你在复习时把这些看似简单的算法整理成一页纸总结包含模型假设、损失函数、优化方法、空间和时间复杂度、适用场景、与其他算法的对比。笔试时遇到这类题按这个框架答既全面又有逻辑很容易在众多答案中脱颖而出。4. 手写代码与思维题真实笔试环境中的生存法则市面上很多针对校招笔试的攻略都聚焦在刷题量上但我在带团队和参与面试的过程中越来越意识到大厂算法工程师的笔试题不仅仅看你会不会写代码更看重你面对一个开放性问题时的分析和表达能力。这部分在套题里对应的就是手写代码题和开放性设计题。4.1 输入输出与编程环境的坑先聊一个所有校招生都会遇到、但很少有人提前准备的现实问题笔试平台的输入输出格式。很多LeetCode选手在本地IDE写得飞起一上笔试平台就GG大概率是死在输入上。小米的笔试一般用牛客网或者赛码网这些平台和LeetCode不一样LeetCode已经把函数签名给你了你只需要实现核心逻辑而校招笔试的代码题经常要求你自己处理标准输入输出也就是要写完整的main函数用input()或sys.stdin读取。很多基于核心代码模式的训练在这里成了劣势。我总结了一个笔试环境自检清单先确认要写完整程序含输入输出还是只写核心函数如果写完整程序先读入所有输入再开始处理逻辑别边读边处理输出格式严格看题是输出一行还是多行要不要保留小数点后几位提前在本地配置好从标准输入读取→在标准输出打印的模板考试时直接套还有一个实操细节笔试平台的Python默认是2.x还是3.x现在基本都是3.x了但如果你遇到print加不加括号的问题就说明平台切换了环境。提前一天去平台做一道AB的输入输出练习题把这个风险降到最低。4.2 从复杂度分析到方案设计面试官到底想看什么这类题的典型问法是给你一个包含一亿个整数的文件找出出现次数最多的10个数。很多人直接说用HashMap统计所有数的频率然后排序取前10这在实际面试中会被追问到怀疑人生。真正的考察点至少有三个内存限制一亿个整数如果全读进内存大约400MB按4字节每个int算如果内存只有256MB就存不下。所以需要分治或者哈希分桶。频率统计可以用哈希表分桶到多个小文件里每个小文件能装进内存再分别统计。TopK问题每个桶内用大小为10的最小堆维护频率最高的10个数优先队列。这是我常说的具体问题具体分析而不是背答案。这类题在笔试题里常以简答或设计题形式出现即使不要求你写完整代码也要能清晰地描述出方案、复杂度、内存使用和潜在问题。我一直觉得这种题考的不是你会不会写堆而是你有没有真正处理过大规模数据的工程思维。如果你有时间建议多练习设计一个XX系统类题目比如设计一个短链系统设计一个排行榜锻炼自己在限定条件下的取舍能力。5. 复盘从这套笔试题反推算法岗的真实能力要求把这套题完整过一遍后我最深的感受是它像一面镜子照出的不只是你的刷题量更是你的知识体系和思维方式。这里分享几个复盘后的总结。5.1 题量不在多在于你能不能把知识连成网很多准备秋招的学弟学妹问我要刷多少题才够我的回答始终是不用一味追求题量但要做到每道题都过得明白。以KMP为例很多人刷了300道题也不见得能手写KMP但如果你把KMP和自动机、哈希字符串匹配放在一起对比着学搞懂它们各自的适用场景和复杂度那这一块知识就算真正长在你身上了。推荐一个串讲式复习法选一个主题比如字符串匹配把相关算法朴素匹配、KMP、Boyer-Moore、Sunday、Rabin-Karp全部整理一遍画一个对比表格包括时间复杂度、空间复杂度、适用场景、核心思想。用这个方法复习完一轮你对付笔试里的简答题和理解题会绰绰有余。这套题里的很多选择题其实就是在考察你能不能快速识别这道题属于哪个知识点家族。5.2 机器学习部分的复习核心别光会用要能讲清楚笔试里的机器学习题特别喜欢考察为什么。你可以调包调得很溜但问为什么用ReLU而不用Sigmoid你得能说出梯度消失问题、计算效率、稀疏激活等关键点问为什么SVM要用核函数你得能说出原始空间线性不可分时通过核函数隐式映射到高维空间。这套题给算法工程师的定位非常明确不是调参侠而是真正理解模型原理的人。如果你还在准备阶段我给一个最实用的建议每一个你常用的模型都尝试用一句话概括思想三点核心要点一个适用场景的结构总结出来。比如决策树一句话是通过不断划分特征来最小化不确定性三点核心是信息增益/增益率/基尼系数的选择、预剪枝与后剪枝、连续值处理适用场景是特征含义清晰、需要可解释性的表格数据。把这个框架填满机器学习简答题基本就不虚了。5.3 从笔试到面试这套题背后的小米算法岗逻辑最后想聊聊这套题背后折射出的小米算法岗用人逻辑。小米的业务线很多从手机到IoT从互联网服务到智能制造每个方向对算法的要求略有差异但整体呈现出一个共同点不招书呆子只招能解决问题的人。什么叫能解决问题就是给你一个数据表、一个业务指标、一个模糊的问题你能自己把它拆解成技术问题选对模型跑通实验最后给出可量化的结论。笔试中那些看似简单但容易答浅的题比如KNN的应用场景、KMeans的局限性就是筛选这种能力的第一道关卡。如果你已经把本文提到的知识点都覆盖了我建议再进一步把每一类题目的出题意图记录下来整理成自己的考点地图。我当时给学弟做的模拟辅导中有一项核心工作就是帮他做这种考点地图从一道笔试题映射到三个知识模块、两个实际项目案例。最后他顺利拿到了小米的校招offer他后来跟我说笔试当天最明显的感觉是很多题目虽然没见过原题但背后的考点自己都门儿清做起来非常顺手。笔试只是第一关但它决定了你能否站到面试官面前。把这套题吃透再往深处多走一步你在这条路上会走得更稳。
返回列表