2024年秋招-小米集团-算法岗-第二批笔试投了小米的算法岗本来没抱太大希望毕竟今年秋招的算法岗竞争大家都懂。结果九月中旬突然收到第二批笔试通知邮件写得很简短在线测评限时两小时双机位监考。我大概花了一秒钟决定参加——不为了别的就当做一次免费的算法训练反正多一场笔试多一次经验哪怕最后拿不到面试复盘一下题目也是赚的。先说结论小米这场算法岗笔试整体题目风格偏“中规中矩但略有心机”。没有特别偏难怪的魔王题但在基础算法的考察方式上做了不少设计尤其是对复杂度分析和边界条件的考察比单纯刷LeetCode要细腻得多。整场下来选择题占了大头两道编程题反而不是最难的。如果你的目标是冲大厂算法岗我建议在牛客、力扣之外认真把数据结构教材的基础算法再过一遍尤其是KMP的next数组推导、排序算法的稳定性与场景选择、动态规划的经典模型这些都是高频出现的高性价比考点。这篇文章不打算写成面经模板我想按实际考试流程把这一场笔试从收到通知到交卷复盘的完整过程拆开讲重点说题目考了什么、我踩了哪些坑、哪些地方如果重来一次我会选择不同策略。所有涉及具体题目的描述都是基于我个人记忆整理的题型思路不是官方标准题解仅供大家备考参考。1. 笔试通知与整体印象形式、时长和题量分布小米的秋招笔试分批进行第二批一般在第一批考完一周后放出通知。邮件里会写明考试时间窗口和注意事项我这场是晚上七点到九点全程双机位电脑主摄像头拍正面手机开第二机位放在侧后方用来监控桌面和双手。说实话这个监考要求不算苛刻但确实提醒你别动歪脑筋左右乱瞟都有风险。建议提前找一个光线充足、背景干净的房间把手机支架架好考试前把网络和电源确认一遍。题量方面我这场一共是60分钟选择题加60分钟编程题各一题前后各半段整体节奏偏紧凑。选择题包括单选题和多选题考察范围很广从数据结构、算法设计、机器学习理论到深度学习基础、概率统计甚至一道工程场景题都有涉及。编程题是两道一道偏字符串处理一道偏动态规划/贪心。两道都不算很难但都要你手推一遍复杂度不能靠暴力莽过去。这里有一个容易被忽视的点小米笔试系统里选择题部分是不可回退的也就是说你答完一题点了下一题再想回头改前一题是改不了的。这一点跟牛客的很多模拟卷不一样需要在考前适应。我的策略是遇到拿不准的题先标记出来强迫自己在当前页面完成判断、尽快选择再往下走因为事后回改机会不存在。这个机制会让人的心态发生变化特别是多选题选项不敢多勾也不敢少勾容易浪费时间。另一个影响答题策略的因素是系统不会实时显示每题分值只有到了编程题环节能明确看到“该题共XX分”。这意味着选择题阶段没法精确计算风险收益比。从后续的感受来看选择题整体权重并不低尤其是多选题错选漏选都不得分是拉开差距的关键。如果你对某个知识点的记忆比较模糊建议在备考阶段多刷几套往年真题或者牛客网上的大厂笔试题库把多选题的坑提前踩一遍。整体印象这套题属于“基础扎实就能做但想拿高分需要平时积累”的类型。相比我在其他厂遇到的偏怪题小米这套卷子的出题风格更接近校招常规笔试的经典范式算法题不炫技选择题有区分度。准备起来其实不虚考的就是你有没有把基本功吃透。2. 选择题考点复盘从排序算法到机器学习理论的真实覆盖面选择题的实际覆盖范围比我在考前预想的要宽既有数据结构与算法的硬核内容也有机器学习和深度学习理论还有一道关于loss下降曲线分析的工程题。我按回忆把题目涉及的知识点整理成了几个模块下面逐个说。2.1 数据结构与基础算法题这类题目占了选择题的大头大概有接近一半的题量。排序算法是必考的我遇到的题目是给出一组排序算法的平均时间复杂度和空间复杂度表要求判断哪些说法正确。选项里出现了冒泡排序、快速排序、堆排序、归并排序的复杂度比较以及“快速排序在完全有序数组上的表现”这个经典问题。这道题本身难度不大但提醒了我要把基础排序算法的时间复杂度吃透而不是只记个大概。冒泡排序的时间复杂度在最好情况下是O(n)平均和最坏是O(n^2)这个知道的人多但快速排序在最坏情况下的O(n^2)以及其在有序数组上退化的问题如果你只看过LeetCode题解而没有自己推导过很容易在这道题上翻车。字符串算法也出现了考了KMP算法的next数组计算。原题大概是给定模式串abacaba要求计算其next数组。我做的时候先在草稿纸上手动演算了一遍再利用前缀后缀的最长公共元素长度来确定每个位置的next值。这种题不复杂但很考验基本功。如果你已经很久没碰过KMP的推导现场临时想很容易出错。建议在考前把next数组的两种计算版本经典版和优化版都写一遍理解清楚next[i]到底指的是“匹配失败后跳转到的位置”还是“前缀和后缀的最长匹配长度”不同定义下数组的数值是完全不同的考试时一定要看清题干给的是哪种定义。图论方面考了一道关于Dijkstra算法的选择题问的是在带权有向图中Dijkstra算法能否处理负权边以及为什么。答案显然是不能因为贪心选择在当前距离最小的节点时负权边可能让已经确定最短路的节点距离变得更小。这道题考察的其实不完全是Dijkstra本身而是对贪心算法局限性的理解。如果你知道Bellman-Ford和SPFA能处理负权边但说不清Dijkstra失效的根本原因这题就容易做错。除此之外还有一道“快速排序的稳定性”判断题。快速排序是一种不稳定的排序算法这个知识点本身很基础但它和一个经典场景结合到一起给一个对象数组按某个字段排序要求相同键值的对象保持原有顺序应该选择哪种排序算法。答案是稳定的排序算法比如归并排序或插入排序。这种场景化的考法在笔试中越来越常见单纯背“稳定排序有哪些”是不够的要能判断实际场景下的选择理由。2.2 机器学习与深度学习理论题机器学习相关的选择题大概有七八道覆盖面很广。有一道考察KNN算法的题问的是K值选择对模型的影响K值过小会导致过拟合K值过大会导致分类边界过于平滑这是KNN最核心的原理。还有一道聚类算法的题问K-Means算法是否会收敛答案是会因为每次迭代都在最小化总的类内平方误差。但这里有个容易忽略的细节K-Means会收敛到局部最优不一定是全局最优所以不同初始化种子会得到不同聚类结果。这道题如果你只是知道K-Means的大概流程不知道它是坐标下降法的一种特殊形式可能就选不出“多个局部最优解”这个选项。深度学习方面的题目更偏基础有一道考察过拟合的题当训练集损失持续下降而验证集损失开始上升时最可能发生了过拟合应该采用的措施包括正则化、数据增强、早停和Dropout。这道题不难但它是多选题少选一个就不得分所以要把每个选项都考虑清楚。还考了一道关于激活函数的题比较ReLU和sigmoid的优劣ReLU能缓解梯度消失问题但可能导致神经元死亡sigmoid输出在0到1之间且便于概率解释但存在梯度消失问题。这些知识点如果在面试时口头回答很容易但在多选题的语境下每个选项的措辞都可能隐含陷阱比如“ReLU一定优于sigmoid”这种绝对化说法就是错的。有一道很有意思的题考察的是softmax与交叉熵损失的组合为什么在分类任务中softmax函数常常与交叉熵损失函数搭配使用而不是与均方误差搭配答案是softmax输出的概率分布形式与交叉熵的数学结构天然匹配组合使用时梯度表达式简洁数值稳定性更好而MSE与softmax组合会导致梯度更新过于缓慢梯度饱和问题。这道题看起来基础但它考察的是对反向传播过程的真正理解背过公式和能推导出梯度表达式是完全不同的层次。2.3 智能优化算法与实际工程场景题小米这场笔试出现了智能化优化算法的选择题这在我之前做的其他互联网大厂笔试题里不太常见。考了一道关于粒子群算法PSO的题问的是在标准粒子群算法中如果学习因子c1和c2都设置为0粒子群会如何运动。答案是粒子会沿当前速度方向匀速飞行失去认知和社会引导群体无法收敛到最优解。这道题考察的是PSO算法的核心机制——粒子位置更新由惯性权重、个体认知pbest和社会认知gbest三部分组成缺了哪个部分算法行为都会变化。如果你平时只刷LeetCode对这类仿生优化算法的原理可能不熟建议有精力的话把粒子群、模拟退火、遗传算法三种经典优化算法的基本框架和适用范围过一遍它们不是互联网算法岗的主流考点但作为“区分度题”出现的概率不低。还有一道和模拟退火算法相关的题考察的是Metropolis准则当新解比当前解差时以一定概率接受该解这个概率与温度和能量差有关。接受概率的公式是exp(-ΔE / T)当温度越高接受差解的概率越大这保证了算法在初期有较强的全局搜索能力随着温度降低接受差解的概率越来越小算法逐渐趋于局部搜索。这道题如果理解不了“退火”的物理隐喻可能就只能死记公式但如果你记住“高温乱跑低温收敛”这个直观感受答案就顺理成章了。有意思的是还有一道题提到了PID算法场景限定在控制系统中。题目问的是PID控制器的三个参数——比例项P、积分项I、微分项D各自的作用其中积分项可以消除稳态误差微分项可以预测误差变化趋势、抑制超调。这个问题放在算法岗笔试里其实有点跨界但小米有硬件和AIoT的业务线算法岗位偶尔涉及传感器数据处理与闭环控制也不意外。这也提醒我们投递不同业务线的算法岗备考侧重点应该有所调整如果你投的是手机或汽车相关的算法岗信号处理、控制理论这类交叉知识点最好也做个了解。工程场景题考了一道有关模型训练中loss曲线分析的题目给出一条下降后回升的损失函数曲线要求判断可能的原因。选项中包括学习率过大导致震荡、数据中存在错误标签、模型容量不足、正则化权重过强。这道题考察的是调参经验但这里的学习率是核心考点当学习率设置过大时模型参数会在最优解附近来回震荡loss表现为整体下降后剧烈波动甚至不降反升。我当时选了“学习率过大”和“数据标签错误”两个选项理由是loss下降后回升这个模式最典型的原因是模型在某个点跳过了最优点或者被噪声标签带偏了方向。不过说实话“模型容量不足”导致欠拟合的典型表现是loss一直高而不降“正则化过强”的影响是loss平滑下降但提前收敛和曲线描述不太匹配所以我没有选这两个。2.4 概率统计与数值计算题最后还有两道概率统计题印象深刻。一道是条件概率的计算题目给定了两个事件A和B问在B发生的条件下A发生的概率选项设置在0到1之间的不同数值。这类题其实比算法题更容易丢分因为计算简单但一旦审题不仔细把条件概率当成联合概率来算答案就错了。我的经验是看到“在……条件下”直接想贝叶斯公式把已知信息写出来再算不要心算。另一道是数值计算题让估计大数的数量级。题目涉及浮点数精度与算法误差分析给了一段描述问在计算机中表示一个很小的数和一个很大的数相加时可能会出现的问题。答案是精度丢失因为浮点数的表示位数有限数量级差太大的两个数相加时较小数的有效数字会被舍入丢失。这道题在实际工程中经常遇到比如在计算softmax时如果直接对原始分数做指数运算可能出现数值溢出所以标准做法是先减去最大值再做指数运算。笔试里考这个知识点说明出题人希望招的人不仅要会写模型还要理解数值稳定性的重要性。选择题整体覆盖范围广但难度比较均匀。真正拉开差距的不是某一道变态难题而是那些“你好像会、但说不准”的基础知识点。我在多选题上损失了不少分原因是每个选项都需要逐字斟酌稍有犹豫就会多选或者漏选而多选题的计分规则又特别严格。现在复盘如果考前能把机器学习常用算法和深度学习基础概念的“是非判断题”集中过一遍做题时会更有把握。3. 编程题实战拆解字符串处理与动态规划的临场思路两道编程题是前后各配一个第一道偏字符串第二道偏动态规划/贪心。下面分别说说我的思路、代码设计和踩过的坑。3.1 第一题字符串压缩与KMP思想的结合应用第一道题的描述大概是这样给定一个字符串要求实现一个压缩算法将连续重复的字符子串表示为“字符重复次数”的形式但只有当压缩后的长度比原串短时才输出压缩结果否则输出原串。举例来说输入aabcccccaaa压缩结果是a2b1c5a3这个压缩串比原串短所以输出压缩结果但如果输入abc压缩后是a1b1c1比原串长就输出abc。这道题的基础解法并不难一次线性扫描就能做遍历字符串统计连续相同字符的出现次数拼接结果。复杂度是O(n)空间复杂度O(n)。但题目里有一个隐藏的要求如果压缩后的字符串长度没有更短则返回原字符串。这个判断不能放在最后才做因为拼接过程中频繁创建字符串本身就有额外开销。最优做法是先遍历一次计算压缩后的理论长度如果理论长度大于等于原串长度就直接返回原串否则再进行一次遍历生成压缩结果。这样避免了不必要的字符串拼接。不过这道题真正的加分点在于它延伸问了一个进阶问题如果字符串中存在大量短重复子串如何设计更优的压缩方案我印象中题目没有明确要求实现但在注释里提到了可以考虑更复杂的模式匹配。我当时脑子里第一个想法是使用类似KMP算法的思想找到字符串中的循环节。对于形如abababab这样的输入如果只是按连续相同字符压缩结果会是a1b1a1b1...完全没有压缩效果。但如果能识别出ab这个循环节就可以表示成(ab)4压缩率会更高。这道题我当时没用KMP因为KMP的next数组计算在这个场景下要额外维护很多索引写完还要验证边界条件风险太高。我选择了稳妥的双指针扫描方案一个指针记录当前字符的起始位置另一个指针向后遍历直到找到字符变化的位置两者之间的距离就是该字符的重复次数。代码逻辑很简单但正因为简单才不容易出错。以下是核心代码片段Java实现public String compressString(String S) { if (S null || S.length() 0) { return S; } // 第一遍遍历计算压缩后的理论长度 int compressedLen 0; int n S.length(); int i 0; while (i n) { int j i; while (j n S.charAt(j) S.charAt(i)) { j; } // 当前字符的重复次数 j - i compressedLen 1 String.valueOf(j - i).length(); i j; } // 如果压缩后没有更短直接返回原串 if (compressedLen n) { return S; } // 第二遍遍历生成压缩结果 StringBuilder sb new StringBuilder(); i 0; while (i n) { int j i; while (j n S.charAt(j) S.charAt(i)) { j; } sb.append(S.charAt(i)); sb.append(j - i); i j; } return sb.toString(); }这道题有几个容易被忽略的细节。第一是计数数字的位数问题如果某个字符连续出现100次压缩表示是a100长度是4而不是3我一开始用的1 1固定长度算法漏算了String.valueOf(count).length()后来改过来。第二是返回原串时的边界情况如果输入是空串或只有一个字符直接返回本身不需要走压缩逻辑。第三是原地修改与原串比较的问题如果用StringBuilder拼接不会修改原始字符串所以无需担心。我当时做这道题大概花了15分钟主要时间花费在压缩后长度的精确计算上。如果能提前想到数字位数的坑还能再快一点。3.2 第二题有限背包变体与贪心策略的取舍第二道编程题是一道背包问题的变体题目大意是给定一组任务每个任务有收益值和时间消耗要求在总时间限制内选择若干个任务执行使得总收益最大但特殊限制是所有任务的执行顺序会影响实际收益——部分任务只有在前置任务完成后才能获得完整收益否则只能获得一半收益。这道题本质上是一个“带依赖关系的调度问题”完全用传统的0/1背包模型去套是行不通的因为物品之间存在先后依赖关系。我一开始的想法是用拓扑排序配合动态规划来解决即先处理没有依赖的任务再逐步处理依赖任务。写下这个思路后我意识到题目给出的依赖关系并没有构成一个复杂的DAG只是每个任务最多依赖一个前置任务。这种情况下可以把问题转化为树形结构用树形DP树形动态规划来求解对于每个任务节点选择执行它时其子任务才能被考虑不执行它时子树整体都无法执行。这道题目的关键转换是理解“前置任务”的含义。如果把每个任务视为一个节点前置任务指向该任务的边形成一棵棵树或森林那么问题就变成了在总时间限制T内从森林中选一些节点使自己收益最大并且选一个节点必须选它的祖先节点。这正是树形依赖背包的经典模型。状态定义为dp[u][t]表示在以节点u为根的子树中消耗t时间能获得的最大收益。状态转移时需要将每个子节点当成一组物品来做分组背包。但由于题目给出的依赖关系简单每个任务最多一个前置任务我选择了一个更简洁的贪心思路先对所有任务按“收益/时间”比值排序优先选择单位时间收益最高的任务。但这道题其实不能直接用贪心通过因为背包问题的容量限制使贪心失效局部最优不等于全局最优。现场的取舍是我先写了贪心作为保底拿到部分通过率再考虑动态规划优化。题目输入规模大概在n100到1000之间这个量级其实是适合用二维DP解的时间复杂度O(n*T)大概在10万到100万级别完全在可接受范围内。但我的实际情况是写完第一道题后剩余时间已经不多了加上树形DP的编码量比较大最终选择先提交贪心版本保住部分测试用例的分数然后再根据剩余时间来决定是否补全动态规划。这里想提醒大家一个笔试技巧当编程题时间紧张时先写一个能跑通的暴力或贪心版本保证至少拿到部分分数再去优化冲刺满分。千万不要一开始就挑战最优解结果写不完或者写出来有bug最后连保底分都没有。我在别的笔试中吃过这个亏这次吸取了教训。下面是我当时没有完全写完的树形依赖背包核心代码框架用的是DFS回溯的写法def dfs(u, time_left, adj, value, cost): if time_left 0: return 0 # 初始化不选当前任务收益为0 best 0 # 选择当前任务后剩余时间用于子任务 if cost[u] time_left: # 将子任务作为分组背包处理 dp_children [0] * (time_left - cost[u] 1) for v in adj[u]: # 子任务v有选或不选两种可能选的话需要再消耗时间 new_dp dp_children[:] for t in range(time_left - cost[u] 1): # 给子任务v分配时间t child_gain dfs(v, t, adj, value, cost) for used in range(t, time_left - cost[u] 1): new_dp[used] max(new_dp[used], dp_children[used - t] child_gain) dp_children new_dp best max(0, value[u] max(dp_children)) return best这段代码只是临时的伪代码思路实际提交的版本是用贪心堆排序维护剩余时间内的任务选择稳定拿到部分通过率。如果你正在准备类似面试题我建议把树形依赖背包问题的状态转移背熟这道题在互联网大厂的算法岗笔试中出现频率不低。3.3 编程题的复杂度分析与优化空间两道编程题对复杂度的要求其实都不高关键在于题目本身有没有把复杂度考察写进评分标准。第一题如果直接用嵌套循环会超时需要O(n)线性扫描第二题如果对每个任务做全排列或暴力搜索在n1000时会超时。但如果你能设计出O(n*T)的DP就能拿到不错的分数。考场上还需要特别注意输入输出格式的问题。我自己在笔试时经常因为Scanner或System.in的写法不对导致本地测试通过但线上不通过。推荐的做法是如果题目输入只有一行直接用readLine拆分如果有多行用BufferedReader一次读入再按行处理。避免使用Scanner的nextInt配合nextLine混用导致换行符问题。还有一点笔试系统的评测环境通常不会给编译错误提示如果代码编译不过直接就是0分。建议在本地IDE先用几个小测试用例验证代码逻辑再复制到在线编辑器。我一般会准备几个边界测试空字符串、全相同字符、单字符、长度极大字符串、背包时间限制为0等。这些边界用例往往能提前发现低级错误。4. 笔试中的时间分配与临场策略一次真实的答题决策过程这一节想聊聊比题目本身更重要的东西时间分配和心态管理。笔试的两个小时看似很长但如果你每道选择题都纠结三分钟编程题又反复调试时间很快就没了。我这场笔试的时间分配大致是这样的选择题部分用了差不多65分钟编程题第一题15分钟第二题25分钟剩余时间用来检查选择题中拿不准的标记题和整理编程题的代码格式。整体节奏还算合理但有一部分时间浪费在了一道多选题上现在回想起来有点可惜。4.1 选择题的时间预算与控制方法我给自己定的选择题速度标准是单选题平均40秒一道多选题平均1分半一道。如果一道单选题超过1分钟还没头绪就先选一个最有把握的答案然后标记跳过不恋战。多选题如果超过2分钟还判断不出每个选项的正误同样先选择一个相对稳妥的组合继续往下走。要记住选择题做错不会倒扣分但空着必然没分所以尽量做到每题都有答案。当然这里有个实际问题小米笔试系统不支持回退查看标记题所以我说的“标记跳过”其实只是在草稿纸上记录题号到了最后复查阶段也没法回到页面修改。既然如此我在答题时就会强制自己一次做对不再期待后续检查。这种心态反而让我在每道选择题上更专注减少了反复摇摆。对于多选题我的对策是“宁缺毋滥”如果一道多选题有4个选项我能确定的只有两个剩下两个模棱两可我通常会只选那两个确定的选项。虽然可能因为漏选而丢分但至少比错选导致整题0分要好。这个策略需要根据你在总成绩上的目标来调整如果你其他部分信心很足可以稍微激进一点如果整体感觉一般保守策略更稳妥。4.2 编程题拿到题目后的读题与定方案节奏拿到编程题后我第一件事不是马上写代码而是先花2到3分钟在草稿纸上分析题目明确三点一是输入输出边界二是时间复杂度要求三是可能的优化方向。这个过程看似浪费时间实际上能避免大量返工。第一道字符串压缩题相对简单我大概1分钟就确定了双指针方案。第二道背包题我花了5分钟分析依赖关系和状态定义期间尝试了贪心思路但因为局部最优的漏洞太大最终决定用树形依赖背包的DP框架。不过因为时间限制和编码复杂度最终提交的是贪心版本部分测试用例。这个决策过程我到现在都觉得是对的在有限时间内保底分比挑战满分更实际。编程题的代码编写阶段我也给自己定了原则写完一个函数后不要急着提交先用题目的示例测试用例跑一遍如果示例用例通过再补充一个自己构造的边界用例比如极端长度或零输入只有这些都通过后才提交。这个习惯帮我避免了很多“明明逻辑对但输出格式不对”的低级错误。4.3 检查与收尾阶段应该做什么最后剩10到15分钟时系统会提示“距离交卷还有XX分钟”。这时不管编程题是否完全AC我都建议停下来做一次全面检查。检查内容包括选择题的草稿纸上记录的存疑题号是否能根据后续题目回忆出正确答案编程题有没有处理掉溢出、空串、越界等边界条件代码里有没有多余的调试输出导致格式错误。我这次笔试就犯了一个小错第一道编程题的代码里我加了一行System.out.println(compress result: sb.toString());用于本地调试提交前没删掉。好在示例用例通过后我多看了一眼输出及时发现并删掉了这行。你要是习惯用print调试一定要在提交前检查一遍。另外一个经常被忽略的点在线笔试系统中的“运行”和“提交”是两个概念。运行只是测试当前用例不算最终成绩提交后无法修改。我建议最后的5分钟不要碰编程题了除非你只是补充一个等价的小优化否则很容易引入新bug。把时间花在检查答案一致性上更值。5. 从笔试反推准备方向给后续候选人的针对性建议当我交完卷把整场笔试的题目在脑子里过了一遍之后一个很清晰的感觉是小米算法岗笔试并不追求“偏难怪”它考的是你有没有系统地学习过计算机基础和机器学习理论。你对这些知识是否有体系化的理解比你能解多少道LeetCode困难题更重要。具体到备考策略我把自己的经验整理成几条第一基础排序和搜索算法的复杂度要能随口说出并理解极端情况。快速排序在有序数组上的退化、堆排序的建堆复杂度为什么是O(n)、归并排序的稳定性来源是什么这些不是面试八股文而是选择题的常客。只背结论不够要能在草稿纸上手动推导。第二字符串算法要掌握KMP的next数组计算过程。这个考点在不同厂的笔试中反复出现很多人觉得麻烦就跳过但实际上你只要在纸上手动走一遍“abacaba”的例子把前缀后缀匹配的规律理解透考试时就不慌了。除了KMP之外BM算法、Sunday算法的原理也可以做个了解万一题目考字符串匹配的效率对比你能说出各自特点。第三机器学习与深度学习理论要覆盖到“为什么”这一层。比如KNN的K值选择、K-Means的收敛性与局部最优、softmax和交叉熵搭配的数学理由、ReLU与sigmoid的梯度差异这些都是高频考点。如果你只了解API调用而不知道底层原理很难在多选题里拿分。第四智能化化算法的原理要懂核心机制。粒子群算法的速度更新公式、模拟退火的Metropolis准则、遗传算法的选择交叉变异步骤这些知识点在大厂算法岗笔试里出现频率虽然不高但出现了就能拉开差距。我的建议是不要死背公式要理解每个算法的“灵感来源”粒子群模拟鸟群觅食、模拟退火模拟金属冷却、遗传算法模拟自然选择。理解了这些考试时即便忘了公式也能通过逻辑推理选出正确答案。第五编程题的高频模型要熟练。字符串处理、双指针、动态规划包括背包问题、树形依赖背包是算法岗笔试的“基础款”必须做到看到题目就能条件反射地想到对应模型。尤其是背包类问题0/1背包、完全背包、多重背包、分组背包、树形依赖背包这五种变体要能写出模板代码。我把常见的笔试试题型和复习优先级整理成了一张表方便大家参照复习知识点常见考察方式复习优先级备注基础排序算法复杂度表格判断、稳定性选择高快排退化场景必考KMP与字符串匹配next数组计算、模式匹配计数高手动推演至少5个样例二叉树遍历与递归前中后序转换、层级遍历高非递归写法也要会Dijkstra/最短路径算法适用条件分析中理解负权边为何失效贪心算法验证贪心正确性、反例构造中学会用“反证法”判断动态规划经典模型背包、LIS、LCS、区间DP高模板代码默写机器学习基础KNN、KMeans、过拟合、评估指标高重点复习多选陷阱深度学习基础激活函数、优化器、CNN/RNN中理解梯度流特征工程与数据预处理标准化、归一化、缺失值处理中理解数值稳定性智能优化算法PSO、模拟退火、遗传算法低记住核心机制即可工程场景题Loss曲线分析、采样策略中调参经验积累还有个容易被忽略的细节是编程语言选择。小米笔试支持Java、C、Python等多种语言但如果你对某种语言的输入输出格式不熟悉建议考前专门花半小时练习一下。我用的Java因为平时刷题就是Java字符串处理和Map的使用都比较顺手。C的STL写起来也很简洁但如果你对指针和内存管理不够熟悉建议还是选自己最有把握的语言笔试现场不是尝试新语言的好时机。再者一定要提前至少一天检查笔试环境。我这次笔试前特意下载了考试客户端测试了摄像头、麦克风和网络稳定性还准备了身份证件放在手边。虽然这些看起来跟算法能力无关但万一考试时设备出问题心态会受到极大影响。经历过在线笔试的人都知道监控系统偶尔会弹出一个“检测到疑似切屏”的警告哪怕你只是点击了系统的边缘按钮。为了避免误判考试过程中尽量不要切换窗口把浏览器里除考试页面外的所有标签页都关掉。这场笔试做完我对小米算法岗的出题风格有了比较清晰的感知题目本身不偏激但考察面广注重基础功底和工程常识。如果你正在准备类似的大厂算法岗笔试建议不用死磕超高难度算法题而是把基础数据结构、经典算法模型、机器学习和深度学习的基础原理过一遍再配合几场模拟笔试练手效果会比单纯刷题好很多。希望这些复盘内容能帮到正在准备秋招的同学们。笔试只是第一关后面还有面试和更深入的技术考察稳住节奏扎实准备总会有好结果。