十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

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

小米秋招软件开发笔试复盘:覆盖数据结构、操作系统与算法

小米秋招软件开发笔试复盘:覆盖数据结构、操作系统与算法 1. 写在前面这套笔试题到底考察什么2022年小米秋招软件开发岗笔试岗位方向涵盖嵌入式、移动端、后端等多个细分赛道试卷结构上采用“选择题编程题”的组合形式。如果你正在准备互联网大厂秋招这套卷子的参考价值并不低原因在于它非常典型地反映了国内头部厂商对校招软件工程师的通用能力预期——不偏门、不炫技但覆盖面广容易暴露基本功漏洞。我当时拿到这套卷子时的第一感受是时间紧、题量中等偏上、编程题难度梯度明显。整套卷子限时120分钟选择题大约在30道左右编程题2-3道。如果你对某些基础概念不熟选择题会消耗大量时间导致后面编程题写得仓促。所以做这套卷子本质上是在测试你两件事一是知识储备的广度二是时间压力下写对代码的能力。这篇文章我会从题型拆分、考点解析、编程题思路、避坑经验几个方面来拆解这套卷子不仅仅讲题目本身更会结合大厂笔试的通用套路告诉你为什么这类题会成为高频考点以及如何通过一套卷子举一反三。2. 整体考情复盘题量分布与能力画像2.1 题型结构与分值占比先说结论小米这套卷子的题型结构和字节、腾讯、美团等大厂秋招笔试高度相似基本可以归纳为“选择题60% 编程题40%”的配比。选择题覆盖数据结构、操作系统、计算机网络、数据库、面向对象、Linux基础等硬核计算机基础编程题则围绕字符串处理、动态规划、数据结构设计等经典场景出题。我根据记忆和同类笔试题做了一张题目分布参考表具体题号可能因批次不同有差异但考察范围大差不差考察模块题型大致题量难度数据结构与算法选择题10道左右中低C/Java基础与内存管理选择题5-6道中操作系统进程、锁、死锁选择题4-5道中计算机网络TCP/IP、HTTP选择题3-4道中低数据库索引、事务隔离选择题2-3道中Linux命令与脚本基础选择题2-3道低编程题在线代码2-3道中高这里要提醒一句大厂笔试选择题往往是不定项选择或“选出错误的一项”比单纯的多选题更阴险。比如给你四个关于死锁的说法让你选出说法错误的那一个——如果你对死锁的四个必要条件记忆模糊这道题就会变成纯粹的猜谜游戏。2.2 大厂笔试真正想考察的能力很多同学刷题时容易陷入一个误区拼命刷LeetCode难题觉得笔试就是比谁AC的题多。但以我做过十几家厂笔试题的经验来看大厂笔试的通过线从来不是“全对”而是“稳定”尤其是选择题的正确率必须保证在70%以上。为什么因为选择题考察的是你大学四年是否认真学过专业课。操作系统、计算机网络、数据库这三门课刷题刷不出来必须靠理解。而编程题只要AC一道再有一道通过部分用例基本上就能进入面试环节。所以这套卷子的核心策略应该是选择题稳住编程题保一争二。从能力画像的角度看这套卷子考察的是三类能力基础知识的记忆准确度、代码实现的速度与准确性、算法思维的灵活度。你可以把笔试理解成一场“带淘汰性质的体检”不要求你每一项都满分但不能有明显的短板。2.3 时间分配策略别让选择题吞掉编程题时间我当时的做题节奏是前60分钟集中做选择题遇到卡壳的立刻标记跳过不做任何纠结中间50分钟做编程题先审题、想思路、写伪代码再动手敲最后10分钟检查选择题中标记的题目并补充编程题的边界用例。为什么这么分配因为选择题一旦纠结很容易5分钟就没了而且还不一定能做对。编程题的AC率才是拉开差距的关键一道完整的AC题相当于五六道选择题的分数。如果你平时模拟笔试时养成“死磕选择题”的坏习惯到了真实笔试场上大概率编程题会写不完。3. 高频考点逐个拆解从选择题到编程题3.1 数据结构选择题考点集中在树、图、堆与排序稳定性这套卷子数据结构部分的选择题难度不大但覆盖面比较广。常考的点包括二叉树的遍历序列还原、平衡二叉树的调整过程、堆的插入与删除、图的存储结构与遍历、各种排序算法的时间复杂度和稳定性比较。我印象比较深的一道题是给出二叉树的前序遍历和中序遍历序列要求还原后序遍历。这类题属于数据结构的“送分题”但每年都有不少同学做错原因在于递归思想不够熟练。其实解决办法很简单——纸上画图。前序遍历第一个节点一定是根在中序遍历中找到这个根的位置左边是左子树、右边是右子树然后递归处理左右区间。这个思路20秒就能走完比在脑子里空想要快得多。还有一个高频点是排序算法比较建议把这张表背下来排序算法平均时间复杂度最坏时间复杂度空间复杂度稳定性快速排序O(nlogn)O(n²)O(logn)不稳定归并排序O(nlogn)O(nlogn)O(n)稳定堆排序O(nlogn)O(nlogn)O(1)不稳定插入排序O(n²)O(n²)O(1)稳定选择排序O(n²)O(n²)O(1)不稳定选择题里经常会出现“稳定的排序算法是哪些”“堆排序的空间复杂度是多少”这类问题。如果你能默写这张表数据结构模块基本上就能稳稳拿下。3.2 操作系统选择题进程状态、死锁、虚拟内存是三大必考操作系统模块的题量虽不算多但几乎每年必考重点集中在三块进程状态转换、死锁必要条件、虚拟内存与页面置换。进程状态那部分最容易出错的是“就绪态、运行态、阻塞态”三者之间的转换条件。记住一个核心原则只有运行态能主动进入阻塞态就绪态只能被调度器切换到运行态阻塞态只能通过事件完成回到就绪态。这个知识点虽然基础但如果在选择题里换一种问法比如“下列关于进程状态转换的说法错误的是”很多同学就会因为记忆不准确而被迷惑。死锁这块银行家算法是笔试选择题的常客难度不高但计算量大。你需要搞清楚安全序列的判断方法即能否找到一个进程执行顺序使每个进程都能在资源充足时完成。我在考场上遇到这类题一般直接用表格推演把每个进程的已分配资源、最大需求、可用资源写清楚逐步模拟基本上两分钟就能出答案。虚拟内存的考察点集中在页面置换算法上尤其是LRU、FIFO、Clock算法的缺页次数计算。做这类题一定要画时间轴一行一行推千万不要心算。心算的出错率极高我在练习阶段就吃过亏——明明思路是对的结果因为少算了一次置换答案就错了。3.3 计算机网络选择题TCP三次握手、HTTP状态码要滚瓜烂熟这套卷子网络部分的题目比较常规主要围绕TCP协议和HTTP协议展开。TCP的三次握手过程、四次挥手状态变化、拥塞控制算法是必考内容HTTP的常见状态码含义、GET与POST的区别也属于送分题。这里有一个容易混淆的点TCP四次挥手中TIME_WAIT状态的作用。答案是“确保最后一个ACK能够到达对方如果丢失则让对端重发FIN”。这个状态持续时间为2MSL最大报文段生存时间的2倍很多选择题会在这里挖坑问你TIME_WAIT的作用“是保证数据可靠传输还是保证连接可靠关闭”。答案是后者但如果你理解不到位很容易选错。HTTP状态码的记忆技巧是分层记2xx表示成功、3xx表示重定向、4xx表示客户端错误、5xx表示服务端错误。笔试常考的是301永久重定向、302临时重定向、403禁止访问、404未找到、500服务器内部错误。只要记住这几个基本够用。3.4 数据库选择题索引、事务、隔离级别一个都不能少数据库模块题量不多但我觉得这是这套卷子里最需要“认真看书”的部分。索引相关题目喜欢考B树相较于B树的优势核心记忆点是B树的所有数据都存储在叶子节点并且叶子节点之间通过链表相连这样的结构让范围查询和遍历变得更高效。事务隔离级别也是高频考点四个级别从低到高依次是读未提交、读已提交、可重复读、串行化。每种隔离级别解决什么问题、会引入什么问题都要搞清楚。比如读已提交能避免脏读但会出现不可重复读可重复读能避免不可重复读但可能出现幻读MySQL的InnoDB通过间隙锁解决了这个问题。这套逻辑理清楚了选择题基本不会错。3.5 Linux与语言基础考察实用能力而非死记硬背Linux部分的题量不大但经常考察实际使用能力比如给你几个命令问哪个能查看进程的实时状态答案是top而不是ps因为ps是静态快照。这类题目如果你只是看书没有实际操作过很容易选错。C/Java基础部分则集中在内存管理、虚函数、多态、垃圾回收等概念上。比如C中虚函数表的存放位置、Java中堆和栈存储的内容、浅拷贝和深拷贝的区别。这些都属于语言层面的核心知识点建议复习时以“理解”代替“记忆”因为选择题通常会换个说法来考你。4. 编程题实战解析思路、代码与完整推导4.1 编程题出题风格难度分层从字符串到动态规划小米的笔试编程题通常呈现出明显的难度递增梯度。第一道题往往偏向字符串处理或模拟属于“必须AC”的保底题第二道题开始涉及数据结构和算法设计比如链表操作或动态规划如果有第三道通常是综合性较强的算法题考察你的临场思维深度。这类题目的共同特点是题目描述长背景包装多但核心考点就那么几个。你需要练就一双“透过现象看本质”的眼睛——把题目背景剥掉直接定位到它考察的算法模型。我在刷题时有一个习惯每读完一道题先在草稿纸上写下这道题属于什么类型模拟、双指针、动态规划、贪心、图论再开始想解法。这样看似多花了一分钟实际上能避免走错方向。4.2 典型题目还原一字符串压缩与解压缩这道题是典型的字符串处理题题目大致是这样给定一个压缩规则比如3[a]2[bc]表示a重复3次、bc重复2次要求输出解压后的字符串aaabcbc。输入可能嵌套比如2[ab3[c]]输出abcccabccc。这类题的核心考点是栈的运用。解法思路是遍历字符串遇到数字就记录下来遇到[就把当前字符串和数字压入栈遇到]就从栈中弹出数字和之前的字符串重复拼接。我给出的参考实现如下#include iostream #include string #include stack using namespace std; string decodeString(string s) { stackstring strStack; stackint numStack; string cur ; int num 0; for (char c : s) { if (isdigit(c)) { num num * 10 (c - 0); // 考虑多位数 } else if (c [) { strStack.push(cur); numStack.push(num); cur ; num 0; } else if (c ]) { int repeatTimes numStack.top(); numStack.pop(); string prev strStack.top(); strStack.pop(); for (int i 0; i repeatTimes; i) { prev cur; } cur prev; } else { cur c; } } return cur; }这里有个关键细节数字可能是多位数比如10[a]所以需要用num num * 10 (c - 0)来累加数字。很多同学第一次写这类题目时会忘记这个细节只处理个位数结果本地跑过了在线提交时却因为多位数用例挂在边界上。4.3 典型题目还原二最长无重复字符子串这道题几乎是各厂笔试的“常青树”小米这套卷子里也出现了类似题目。题目描述很简单给定一个字符串s找出其中不含有重复字符的最长子串的长度。思路是滑动窗口用两个指针维护一个不含重复字符的窗口再用一个哈希表记录窗口内每个字符的最新位置。当右指针遇到重复字符时将左指针跳到重复字符上次出现位置的下一位。参考实现如下#include iostream #include string #include unordered_map using namespace std; int lengthOfLongestSubstring(string s) { unordered_mapchar, int lastPos; int left 0, maxLen 0; for (int right 0; right s.length(); right) { char c s[right]; if (lastPos.find(c) ! lastPos.end() lastPos[c] left) { left lastPos[c] 1; } lastPos[c] right; maxLen max(maxLen, right - left 1); } return maxLen; }这个实现的细节在于lastPos[c] left的判断。如果不加这个条件当某个重复字符出现在当前窗口左边界之前时我们会错误地更新left指针。举个例子字符串abba当遍历到最后一个a时a上次出现的位置是0但当前窗口的left已经是2如果直接更新left为1就会出错。这道题为什么反复考因为它既考察你的双指针思维也考察你对边界条件的敏感性。代码量不大但细节很容易踩坑。4.4 典型题目还原三动态规划——打家劫舍变体动态规划是软件岗笔试的“压轴常客”。小米这套卷子中出现的是一道“打家劫舍”的变体题给出一排房屋每间房屋有盗窃价值相邻房屋不能同时盗窃问能偷到的最大价值。部分变体会限制具体某一家不能偷或者房屋围成一圈头尾相邻。经典打家劫舍的状态转移方程很简单dp[i] max(dp[i-1], dp[i-2] nums[i])含义是当前房屋要么不偷保持前一家能获得的最大值要么偷则需要跳过上一家。空间上还可以优化成两个变量滚动更新省掉整个dp数组int rob(vectorint nums) { int prev 0, cur 0; for (int x : nums) { int temp cur; cur max(cur, prev x); prev temp; } return cur; }但笔试时如果出的是“房屋围成一圈”的变体就需要拆分成两种情况偷第一家则不能偷最后一家不偷第一家则可能偷最后一家。代码实现上可以写一个辅助函数传入子数组范围然后取两种情况的最大值。动态规划题最怕的不是不会写状态转移方程而是没有意识去识别它是一道DP题。我的经验是如果一道题问的是“最大值、最小值、方案数、能否达到”大概率是动态规划。你在笔试时遇到这类关键词应该立刻在脑海中切换成“DP模式”。5. 备考方法论从一套卷子到整个秋招笔试的全面准备5.1 时间规划三轮复习法从广度到深度如果你现在距离秋招还有2-3个月建议不要直接刷套题而是按轮次系统复习。第一轮用2-3周快速过一遍计算机基础的核心知识点以教材和笔记为主目的是把遗忘的概念捡起来第二轮用3-4周集中刷题从LeetCode热门题到各厂笔试题按专题刷第三轮用最后2-3周做整套模拟严格计时模拟真实笔试环境。这套方法论的核心逻辑是先广度、后深度、再实战。很多同学直接刷套题结果选择题错一半编程题写不完然后心态崩了这是最不划算的复习方式。笔试的知识点反复出现你先系统过一遍再刷套题效率会高出很多。5.2 刷题工具与资源别迷信题海战术要精准打击刷题平台方面LeetCode的Hot 100和剑指Offer是基础最好全部吃透牛客网则有大厂历年笔试真题可以按公司筛选考前专门拿目标公司的题目练手。我个人的建议是不要把时间花在过于冷门的偏题怪题上大厂笔试的出题风格非常稳定高频考点反复出现。我在刷题时养成了一个习惯每道题做完之后不只是看了一遍题解就完事而是会在代码旁边写下这个题的核心思路、复杂度、易错点。比如一道题我用的是双指针我会写下一句话总结什么场景下适合用双指针、这道题的指针移动条件是什么。这样日积月累积攒下来的笔记在考前复习时就是无价之宝。5.3 笔试现场的经验技巧ACM模式与IDE选择这里必须强调一个很多新手忽略的问题大厂线上笔试通常是ACM模式需要你自己处理输入输出而不是LeetCode的答题模式。平时刷LeetCode只用写函数体到了笔试现场可能连字符串解析都要自己写这个差异会让很多同学栽跟头。建议从秋招前一个月开始所有练习都在牛客网的ACM模式下进行让自己适应cin、cout和scanf、printf的写法。关于语言和IDE的选择我在实际笔试中见过太多因为不熟悉环境而翻车的情况了。考场上通常提供多个语言选项选择你最有把握的语言不要临时更换。如果你用C建议优先使用scanf和printf而不是cin和cout特别是在大数据量输入的场景下关闭同步的cin虽然也能用但省心起见直接用scanf最稳。5.4 心态管理笔试是淘汰赛不是排位赛大厂笔试的通过率一般在20%-30%左右这意味着大部分人是被淘汰的。这个数据听着吓人但换个角度想你只要超越了70%的人就能进入面试。所以切忌在一道选择题或一道编程题上死磕合理放弃是笔试的大智慧。我遇到过不少同学第一道编程题写了40分钟还没思路结果后面两道题完全没时间看。这种策略是极端错误的。正确的做法是先快速把三道编程题都看一遍按难度排序先做最简单的再挑战中等难度最后用剩余时间尝试难题的部分用例。即使拿不到AC尽力通过部分用例拿到部分分数也比空着强。6. 常见问题与避坑经验这些都是踩过的坑6.1 选择题的坑不定项与“选错误项”陷阱大厂笔试题最喜欢出的坑是把确定项改成不定项问你“以下正确的是哪些”然后在选项中混入一个看似正确实则错误的描述。比如考察TCP时把“UDP是面向连接的”和“TCP是无连接的”混在选项里如果你对这两者的特性只是模糊记忆很容易把两个错误选项都选上去。针对这个坑我的方法是做选择题时先判断每个选项的对错而不是先猜测出题人的意图。在大脑里把每个选项对应的知识点完整过一遍确保选出的每一个选项都有理论依据。如果你只是觉得“好像对”那大概率是陷阱。6.2 编程题的坑输入输出格式与边界条件线上笔试的输入输出格式硬性要求非常严格多输出一个空格、少输出一个换行都可能被判为错误。比如ACM模式下要求每行输出一个结果有些题会在最后一行要求没有多余的空格和换行如果你平时没有养成检查输出格式的习惯很可能在这些细节上丢分。边界条件方面最容易漏掉的是空数组、数组长度为1、极大数值、负数等。我在做滑动窗口类题目时养成了一个条件反射写完代码之后先检查一遍数组为空时会不会访问越界字符串长度为1时循环是否正常这个习惯让我避免了大量笔试现场的尴尬。6.3 时间管理的坑不要被一道题绑架我自己在秋招笔试中最大的教训就是被一道动态规划题“绑架”了将近半小时导致后面两道简单题没做最后只进了一家中小厂。从那以后我给自己定了一个铁律每道题最多思考15分钟如果15分钟没有思路果断跳过把所有会的题做完后再回头。这个规则听起来简单执行起来却不容易。当你花15分钟读题、思考已经有了部分思路你会觉得“再给我5分钟肯定能写出来”然后被这种虚假的希望拖进深渊。正确的心态是这是一场限时比赛不是学术研究我们的目标是总分最大化而不是每一道题都完美解决。6.4 知识盲区的坑如何“蒙”对不会的选择题虽然我不提倡全靠蒙但考场上总会遇到完全陌生的知识点。这时候使用一些“生存技巧”可以提升猜对的概率。比如排除法先把确定错误的选项划掉如果剩下两个不确定优先选和你熟悉概念相似的选项如果四选一完全不会选描述比较保守、包含“通常”“一般”等限定词的选项往往是正确项。这里要特别提醒一个问题大厂笔试往往会倒扣分尤其是多选题漏选得一半分错选则全扣。这种情况下如果你不确定某个选项是否正确宁可不选也不要冒险。稳一点多拿保底分才是笔试过关的王道。7. 写在最后的建议回过头来看2022年小米秋招笔试-软件开发-卷2这套题的价值并不仅仅在于它本身而在于它是一个很好的“体检工具”。做完这套卷子你应该能清晰地感受到自己哪些模块扎实、哪些模块薄弱然后在接下来的备考中针对性补齐。我个人经历过整个秋招季最大的体会是笔试不能靠运气只能靠准备。那些看起来“裸考”就能进面试的人大概率在你看不到的地方刷了几百道题、翻烂了好几本专业书。准备笔试的过程虽然枯燥但它是你进入心仪公司的第一道门槛值得你投入足够多的时间。最后再分享一个小技巧笔试结束后一定要趁热打铁复盘。把做错的题目、没写出来的思路、卡住的知识点全部记录下来隔天再复习一遍。这个过程虽然痛苦但效果立竿见影。我秋招后期笔试正确率明显提升靠的就是每一场笔试题后的认真复盘。祝看到这里的你笔试顺利Offer到手。
返回列表