ARTICLE DETAIL

资讯详情

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

2024小米软件开发岗笔试经验:数据结构与算法备考全攻略

2024小米软件开发岗笔试经验:数据结构与算法备考全攻略 2024年秋招小米集团软件开发岗第二批笔试我前前后后准备了两个多月把牛客和力扣翻来覆去刷了几遍最后笔试成绩还算理想顺利拿到了面试资格。这段时间有不少学弟学妹来问我笔试到底考什么、怎么准备干脆把整个过程的复盘和经验整理出来给正在备战秋招或者准备春招的朋友一个参考。先说结论小米的软件开发岗笔试整体难度在互联网大厂里属于中等偏上题目类型比较规整重点考察数据结构和算法基础同时也会涉及一部分计算机基础知识的综合题。和字节、阿里那种动辄三四道hard级算法题压场的风格不同小米的笔试题量适中但更注重基础功底的扎实程度和代码实现的规范性。换句话说你不需要是竞赛选手但必须把基础打得足够牢固。1. 投递前的准备工作与岗位匹配分析1.1 今年秋招时间线与投递策略第二批笔试的时间节点大概在九月下旬到十月初这是一个非常微妙的时间段。九月初大部分互联网公司已经完成了第一批笔试部分同学已经拿到了意向书而第二批笔试更像是补录和扩招的通道竞争相对没有第一批那么惨烈但岗位的HC招聘名额也会相应减少。我当时投递的时候选的是软件开发工程师通用方向这个岗位最大的特点是覆盖面广不区分具体的业务方向笔试通过后会有部门和候选人之间的双选环节。如果你对某个方向有明确偏好比如说嵌入式开发、移动端开发投递的时候要看清岗位名称小米每年会单独开放嵌入式软件开发工程师、Android开发工程师的招聘通道笔试题目会和通用软件开发岗位有所区别嵌入式方向会更侧重C语言、内存管理、寄存器操作、中断处理这些内容而通用软件开发岗位则全面覆盖数据结构和算法。再补充一个重要信息小米的简历筛选是有一定门槛的第二批笔试的筛选比例会比第一批宽松一些所以如果你前期没有拿到其他大厂的面试机会趁小米第二批投递是一个完全可以争取的机会。我当时身边就有好几个双非院校的同学凭借项目经历和笔试成绩杀进了面试环节。1.2 笔试信息获取渠道与注意事项关于笔试通知的获取最靠谱的是两个渠道官方招聘网站和预留的手机短信、邮箱。小米的笔试通知通常会提前三到五天发送里面会写明笔试时间、笔试平台、注意事项。这里有一个很容易踩的坑笔试平台的测试链接和正式考试链接有时候是两个不同的入口建议在收到通知后第一时间登录平台完成设备测试千万不要等到开考前半小时才去调试环境。笔试平台方面小米用的是牛客网和赛码网这两个常见平台之一具体看当年通知。牛客网的在线编程环境支持C/C、Java、Python等主流语言赛码网也很类似。我建议提前用自己熟悉的语言在平台上模拟练习几道题熟悉输入输出格式尤其是多行输入的读取方式很多同学笔试翻车就翻在输入解析上。另外有一些细节值得注意摄像头和麦克风检查笔试全程会有AI监考摄像头必须提前打开否则会被判定为作弊嫌疑。网络稳定性除非万不得已不要用公共WiFi手机热点也是备选方案。草稿纸准备部分题型需要手算提前准备几张白纸和两支笔。身份证明有些场次需要在开考前出示身份证或学生证进行人脸识别验证。2. 笔试整体结构与核心考点拆解2.1 笔试题型分布说明小米软件开发岗的笔试时长通常在100分钟到120分钟之间总分100分。从题型结构上划分大致可以分为三块单选题、多选题、编程题。有些批次还会额外加入简答题或问答题但2024年第二批的情况以客观题加编程题为主。从我实际考试经验来看各题型的占比如下题型题目数量分值占比考察方向单选题15-20道约30%数据结构、操作系统、计算机网络、数据库、Java/C基础多选题5-10道约15%代码原理辨析、多线程与并发、设计模式、Linux操作编程题2-3道约55%数据结构相关算法、字符串处理、动态规划、搜索与图论为什么编程题的分值占比这么高这和大厂招聘的整体趋势是一致的。互联网行业招聘软件开发工程师算法和代码能力是衡量候选人底层素质最直接的指标。尤其是小米这种体量的公司面试环节往往会追问项目细节而笔试通过算法题先筛选掉一批代码功底不过关的候选人能大幅提升面试环节的效率。2.2 高频考点与必背知识点汇总先整理高频考点这部分是我刷了近三年小米真题和其他大厂真题后总结出来的按优先级排列第一梯队必考必会数组和字符串的遍历、查找、双指针操作链表的基本操作尤其注意链表的反转、合并、环形链表判断栈和队列的经典应用比如括号匹配、单调栈问题二叉树的前中后序遍历层序遍历以及二叉树的高度、直径、公共祖先排序算法的手写实现尤其是快排、归并排序要能熟练写出并分析时间复杂度动态规划入门包括背包问题、最长上升子序列、最长公共子序列第二梯队考频较高哈希表和滑动窗口的结合应用图的深度优先搜索和广度优先搜索并查集前缀和与差分数组贪心算法的基本应用第三梯队偶尔出现线段树、树状数组字符串匹配算法比如KMP拓扑排序最短路径算法在操作系统和计算机网络部分考察重点相对固定进程和线程的区别及它们之间的通信方式死锁产生的四个必要条件银行家算法内存管理方式虚拟内存、页面置换算法TCP和UDP的区别TCP三次握手四次挥手HTTP协议状态码含义HTTP和HTTPS的区别数据库索引的底层数据结构事务的ACID特性SQL语句编写3. 算法编程题实战拆解与思考过程3.1 经典编程题型的解题模板编程题是整个笔试中分值最高、区分度最大的部分。以我参加的那场笔试为例三道编程题分别考察了数组处理、二叉树遍历和动态规划。虽然不是特别偏难怪的题目但每道题都设置了一些边界条件的陷阱稍不留神就会掉进去。先说说做题顺序的策略。我个人的做法是拿到卷子后先花1到2分钟快速浏览这三道编程题从易到难排序先做自己最有把握的题把确定性高分稳稳拿到手再啃难题。不要按顺序死磕第一道题万一遇到没思路的情况浪费大量时间在后面很容易造成心态崩盘。做题顺序确定后每道题的解题流程大致是快速审题圈出关键词和输入输出约束条件尤其关注数据规模。根据数据规模判断算法的时间复杂度要求。比如n在10^5级别O(n²)的算法基本上会超时必须往O(nlogn)或O(n)的方向想。先写暴力解法理清思路再优化到高效解法。边界条件重点测试空输入、单元素输入、全相同元素、最大规模输入。3.2 真题思路还原与代码示例第一道题我遇到的是一道字符串处理类的题目给定一个字符串找出最长无重复字符的子串长度。这道题是LeetCode上非常经典的“无重复字符的最长子串”用滑动窗口即可解决。虽然题目本身不难但在笔试环境下需要一次通过所有的测试用例对边界条件的把握要求很高。这里给出一个Python实现时间复杂度O(n)空间复杂度O(字符集大小)def lengthOfLongestSubstring(s: str) - int: # 哈希表记录每个字符最后一次出现的位置 char_index {} left 0 max_len 0 for right in range(len(s)): if s[right] in char_index and char_index[s[right]] left: # 如果当前字符在窗口内重复移动左边界 left char_index[s[right]] 1 char_index[s[right]] right max_len max(max_len, right - left 1) return max_len这道题的核心在于理解滑动窗口的移动规则。每当遇到一个重复字符左边界跳到上一次出现位置的后一位。我在做题时顺手在这个思路旁边写了一段注释“窗口内不重复的最长长度实时更新。”这个习惯在笔试中非常实用尤其是碰到题目较长的情况注释能帮你快速理清思路。第二道题是二叉树相关要求计算一棵二叉树的最大路径和。路径可以从任意节点出发但只能从父节点到子节点的方向连接不能走回头路。这道题考察的是后序遍历和递归思想的理解。我的解法思路是对于每个节点计算经过它的最大路径和等于左子树最大贡献值加上右子树最大贡献值再加上当前节点值全局最大值在递归过程中不断更新。class TreeNode: def __init__(self, val0, leftNone, rightNone): self.val val self.left left self.right right class Solution: def maxPathSum(self, root: TreeNode) - int: self.max_sum float(-inf) def dfs(node): if not node: return 0 # 计算左右子树的最大贡献值负数则不采用 left_gain max(dfs(node.left), 0) right_gain max(dfs(node.right), 0) # 经过当前节点的路径和 current_sum left_gain right_gain node.val self.max_sum max(self.max_sum, current_sum) # 返回给父节点的最大贡献 return max(left_gain, right_gain) node.val dfs(root) return self.max_sum这里有一个关键点dfs函数返回的值不能包含同时经过左右子树的路径因为父节点路径最多只能选择一个方向。很多同学在这题上失分就是因为在计算返回给父节点的值时包含了左右两个方向导致路径走“回头路”了。第三道题是动态规划题题目大意是给定一些物品的重量和价值背包容量有限求能装入背包的最大价值。这个就是经典的0-1背包问题。只要练过基础DP这道题是送分题但前提是你对状态转移方程足够熟悉。def knapsack(W, weights, values): n len(weights) dp [[0] * (W 1) for _ in range(n 1)] for i in range(1, n 1): for w in range(1, W 1): if weights[i-1] w: dp[i][w] max(dp[i-1][w], dp[i-1][w-weights[i-1]] values[i-1]) else: dp[i][w] dp[i-1][w] return dp[n][W]实际上还可以用一维数组压缩空间复杂度这个优化建议写上去展示你对动态规划的掌握程度。3.3 代码规范与提交技巧编程题写完只是第一步提交前的自查同样重要。我总结了一个“三查三改”的策略每次编程题完成后都按照这个流程检查一遍能有效降低失分率一查变量命名是否清晰不要用a、b、c这种无意义命名除非是循环里的临时下标二查边界条件的处理比如数组长度为0、指针为None、数值溢出这些情况三查时间复杂度和空间复杂度是否符合题目限制在注释里简单标注方便阅卷人理解你的思路。如果发现自己的算法复杂度不满足要求尽量在注释中补充说明并给出优化方向。阅卷人能看到你的独立思考这比交一个不完整的答案更有利。编程题的输入输出格式容易出错尤其是使用在线评测系统时。建议在本地IDE里模拟输入输出格式先用题目给的示例测试一遍再用自己构造的边界测试用例验证确认无误再提交。4. 非算法题部分选择题的备考要点与逻辑4.1 操作系统和计算机网络考点解析选择题部分考察的内容比较杂但难度不大以概念辨析和原理理解为主。我统计了近几年小米笔试的选择题考点分布操作系统和计算机网络是绝对的重点占了选择题中的大半壁江山。操作系统考点主要围绕这几个模块进程管理进程和线程的区别、进程状态转换、调度算法先来先服务、短作业优先、时间片轮转、多级反馈队列内存管理分页与分段机制、虚拟内存、缺页中断、页面置换算法FIFO、LRU、Clock文件管理文件的物理结构、目录结构、磁盘调度算法并发与同步互斥锁与自旋锁的区别、信号量机制、生产者消费者问题在复习这部分内容时我强烈推荐结合代码来理解比如用一段创建多线程的Java代码来理解进程和线程的区别比死记硬背概念高效得多。面试的时候面试官大概率也会问你项目中是否实际用到过多线程如果你只会背概念而写不出代码印象分会大打折扣。计算机网络考点主要涉及TCP/IP协议栈各层功能以及每层的核心协议TCP三次握手和四次挥手的状态转换过程以及为什么需要三次握手TCP可靠传输机制滑动窗口、拥塞控制慢开始、拥塞避免、快重传、快恢复HTTP协议的请求-响应模型GET和POST的区别状态码的含义尤其是301、302、403、404、500HTTPS的加密过程对称加密和非对称加密的应用场景DNS域名解析的完整流程很多同学准备计算机网络的时候喜欢背书式的死记硬背但笔试中更喜欢考察“为什么这样设计”的深层次原因。比如TCP三次握手为什么必须是三次而不是两次答案不是简单的“防止历史连接建立”而是因为两次握手无法让双方都能确认对方的收发能力。4.2 Java/C语言基础与数据库考点小米软件开发岗的语言不限制但选择题部分会考察一些语言基础以Java和C为主。Java方面重点考察集合框架的源码原理HashMap的底层结构、扩容机制、红黑树引入的条件、JVM内存区域划分、垃圾回收算法、线程池的核心参数和执行流程、反射机制、注解的原理。C方面重点考察指针和引用的区别、内存管理堆区和栈区、new和malloc的区别、虚函数与多态的实现原理、智能指针、STL容器的时间复杂度、拷贝构造函数与赋值运算符的区别。数据库部分是选择题和编程题都可能涉及的内容。选择题考察的主要是索引的底层数据结构为什么用B树而不是红黑树或哈希表SQL优化的常用手段比如避免全表扫描、合理使用索引、减少回表查询事务的ACID特性隔离级别和各自解决的问题脏读、不可重复读、幻读数据库的三大范式以及反范式设计的应用场景这部分内容考察得非常基础基本上是大学课程的难度但要求你理解得足够深入。比如问到“在什么情况下索引会失效”能列举出函数操作、隐式类型转换、范围查询右侧失效、LIKE前置通配符等情况。4.3 多选题的答题策略与复习思路多选题是失分重灾区因为多选、少选、错选都不得分。我第一场笔试就是多选题失分最多后来总结了几个应对策略对于完全不会的题目不要蒙。蒙错一个选项可能倒扣分视具体规则而定不蒙反而可能保住更多分数。对于有一定把握但不确定的题目采用“保守选”策略只选择自己百分之百确定的选项不确定的宁可不选。多选题的选项之间有时存在逻辑关联性如果两个选项之间明显矛盾那么肯定至少有一个是错误选项这时候可以借助这个规律排除掉明显错误的选项。5. 笔试时间分配与实战应试技巧5.1 各题型时间分配建议笔试总时长一般是120分钟如果你平均分配到所有题型上编程题的时间会不够用。我的时间分配方案是前20分钟完成单选题和部分多选题遇到不会的题目先标记跳过不要纠结中间40分钟集中精力攻克第一道和第二道编程题确保拿稳基础分后40分钟挑战第三道编程题如果10分钟后还没有思路果断放弃回头检查前面做过的题目最后20分钟检查选择题是否有漏选、编程题是否符合题目格式要求这个时间分配方案不是固定的但“先拿基础分再攻难题”的原则是通用的。很多同学容易在一道选择题上花费5分钟以上这种投入产出比对我来说很不划算。一道选择题分值就2分你还不如把这个时间用在编程题上写出一个能通过部分测试用例的版本就能拿到不少分。5.2 编程题的万能调试与排查技巧笔试过程中遇到代码跑不通的情况是常有的事尤其是在压力状态下一些低级错误反而更容易犯。我总结了一套快速调试的方法先在本地IDE中测试题目给出的示例用例确认能通过后再测试自己构造的边界用例。数组类题目的边界测试用例要包含空数组、单个元素数组、全部相同元素数组、倒序数组、规模最大的数组。字符串类题目的边界测试用例要包含空字符串、单个字符、全相同字符、包含特殊字符和空格的字符串、极长字符串。遇到超时问题优先检查是否使用了O(n²)复杂度的算法是否有重复计算的部分可以用前缀和或动态规划优化。遇到语法错误优先检查括号匹配和缩进这是最基础但又最容易犯的错误。这里分享一个我在真实笔试中的经历。那场考试做完第一道编程题后我信心满满地提交了代码结果系统返回了“运行超时”。我检查了好几遍才发现实际是因为输出结果时多次调用print函数导致的IO性能瓶颈最后把所有输出拼接成字符串一次性提交顺利通过了。5.3 心态管理与临场应对技巧笔试不仅是技能的比拼更是心理素质的较量。我见过不少水平不错的同学因为时间分配不当或者遇到不会的题目后半场直接崩盘连会做的题目都做不出来了。建议在笔试开始前深呼吸三次告诉自己“目标不是满分而是尽可能拿分”。遇到不会的题目直接跳过标记一下把所有会做的题目做完后再回头攻克。笔试过程中如果发现时间不够了优先保证已经做完的题目正确性而不是急着去写最后一道题的零散代码。另外一个细节是开考前5分钟一般可以阅读考试说明和浏览试卷结构在这段时间里先把笔试平台的操作界面、题目列表、编辑器设置都看一眼尤其是编程题的输入输出格式说明能让你在正式答题时节省大量时间。6. 笔试后的复盘与面试衔接准备6.1 考后如何快速复盘知识点笔试结束后趁记忆还清晰把考过的题目和知识点记录下来整理成一份自己的“笔试错题集”。我当时在笔记本上记录了三样东西题目考查的知识点、我在做题时的思路过程、我在代码实现中卡住的地方。第一场笔试结束后我发现自己在链表类题目上比较薄弱于是针对性地刷了20道链表题包括找链表中间节点、反转链表、合并K个有序链表、判断回文链表。一周后再做类似的题目明显感觉顺畅了很多。复盘时还有一个重要环节把选择题中涉及的知识点分门别类地整理到一张表格中标记出高频考点和冷门考点。你会发现很多知识点会反复出现在不同公司的笔试中比如HashMap底层原理、TCP三次握手、死锁条件这些是性价比极高的复习点。6.2 笔试与面试的知识点衔接以嵌入式岗位为例小米的软件开发岗位面非常广常规的互联网业务部门、AI部门、汽车部门、IoT部门都在大量招聘软件开发工程师。如果你的简历上有嵌入式相关的项目或者你投递了嵌入式软件开发岗位建议重视C语言和底层知识的复习因为笔试和面试的侧重点会有所不同。以我准备面试时对嵌入式方向的理解来看嵌入式软件开发面试题有几个高频考察方向C语言中的指针和内存管理指针数组和数组指针的区别、函数指针的使用场景、结构体对齐规则、内存泄漏的排查方法编译链接过程从源代码到可执行文件经历的预处理、编译、汇编、链接四个阶段动态库和静态库的区别软硬件交互中断处理流程、GPIO的配置方法、寄存器的读写操作、看门狗的原理为什么特别提到这个方向因为小米的IoT和汽车业务大量涉及嵌入式开发岗位2024年秋招这个方向热度很高投递人数多笔试通过率并不高。如果非科班转码的同学想往这个方向投递建议至少有1到2个基于单片机或Linux的完整项目经历比如智能家居控制系统、环境监测系统、简易的操作系统内核等纯靠刷算法题很难应对面试环节的专业问题。6.3 笔试通过后的简历优化与面试准备如果你笔试顺利通过接下来就是面试环节。小米的面试流程通常是两轮技术面加一轮HR面技术面试会围绕项目经历和基础知识展开。面试前一定要把简历上的每一个项目经历都复盘清楚。我当时在自我介绍时重点讲了一个基于Spring Boot的校园二手交易平台项目面试官追问的第一个问题是“这个项目的数据库表是怎么设计的如果用户量增大到百万级别你会怎么优化查询性能”这类问题没有标准答案但你需要展现出清晰的思考逻辑。说实话我在准备秋招时对“简历上的每个字都要能解释清楚”这句话体会最深。你可以不写特别复杂的项目但一定要把写上去的项目吃透。光是“为什么使用这个技术方案”“有没有考虑过其他替代方案”“项目中的难点是什么”这三个问题就能过滤掉很大一部分候选人。7. 备考路上的资源推荐与时间规划7.1 推荐的学习资源和刷题路线系统性地列出我备考过程中用到的资源这些资源按用途分类方便大家按需自取。笔试刷题主阵地推荐LeetCode和牛客网。LeetCode的“剑指Offer”专项练习板块覆盖了面试中最高频的基础算法题强烈推荐优先完成牛客网的小米历年笔试题库虽然后期有很多公司真题的题目不全但能够帮你熟悉笔试题型和难度价值非常高。理论复习方面推荐以下经典书籍和对应章节数据结构《大话数据结构》和《数据结构与算法分析》重点看链表、栈、队列、树、图、排序、哈希表章节操作系统《操作系统真象还原》和《现代操作系统》重点看进程、线程、内存管理、文件系统章节计算机网络《计算机网络自顶向下方法》重点看应用层、传输层、网络层章节数据库《MySQL必知必会》和《高性能MySQL》重点看索引、事务、锁、SQL优化章节Java《Java编程思想》和《深入理解Java虚拟机》重点看集合、并发、JVM章节需要注意的是不要试图把每一本书从头看到尾而是根据笔试题型和面试考察点做选择性阅读。时间有限的情况下优先搞定高频考点。7.2 三个月备考时间规划参考以3个月为周期制定备考计划前4周是基础复习阶段中间4周是专项突破阶段最后4周是模拟冲刺阶段。基础复习阶段的任务是快速过一遍数据结构与算法的基础知识搭配LeetCode的简单题和中等题巩固。每天固定刷3到5道题不要贪多但要吃透每道题的思路和复杂度分析。操作系统、计算机网络和数据库在这个阶段先以看书和整理笔记为主暂时不需要做太多题。专项突破阶段开始按专题刷题比如一周专门刷二叉树、一周专门刷动态规划、一周专门刷字符串。同时开始刷牛客网的企业真题了解各大厂的出题风格并补充操作系统和计算机网络的练习题尤其是多选题找出自己的薄弱点。模拟冲刺阶段严格按照真实笔试的时间限制进行全真模拟用牛客网或赛码网的模拟考场功能每周至少做两套完整的笔试卷子。模拟考试结束后花时间复盘错题对照答案整理出薄弱知识点再回到书本和题目中针对性加强。这个阶段还可以整理一份自己的“笔试速查手册”把所有重要公式、模板代码、易错点、常见算法模板集中记录考前快速过一遍。7.3 备考中容易踩的坑和避坑建议备考过程很容易走弯路分享几个我自己踩过或看别人踩过的坑希望后来者能避开。第一个坑是盲目追求题目数量。刷题数量很重要但复盘比刷题更重要。我见过一个月刷了300道题但笔试依然失利的同学原因是刷题时只看AC不思考下次遇到变体题就完全没思路。正确做法是每题刷完后复盘这道题涉及什么数据结构用了什么算法思想有没有更优解法这类题型的通用模板是什么第二个坑是忽视基础知识的复习。有些同学本末倒置把80%的精力都花在刷编程题上计算机基础完全没复习。结果笔试时选择题连蒙带猜正确率很低编程题虽然做出两道但总分依然不够线。建议每天安排出固定的时间复习计算机基础哪怕只有30分钟也好积少成多。第三个坑是不做模拟训练。有些同学平时单题练习正确率很高但一到正式笔试就翻车主要原因就是不适应限时答题的节奏。单题练习没有时间压力思路可以慢慢展开而限时答题对心理素质和时间分配的要求完全不同。至少进行5次以上的完整模拟才能游刃有余地应对真实笔试。8. 关于笔试的个人体会与后续建议整个秋招笔试准备的过程对我来说是一段非常宝贵的成长经历。从最初的迷茫焦虑到逐渐建立起自己的知识体系再到最终拿到心仪公司的面试资格每一步都付出了实实在在的努力。印象最深的一点是笔试考察的内容虽然多但80%以上的知识点都是可以在短时间内通过系统学习和大量练习掌握的。尤其是算法题当你熟练掌握了几种核心算法模板双指针、滑动窗口、二分搜索、DFS/BFS、动态规划、回溯算法后大多数题目都能找到对应的解题方向。笔试不仅仅是知识储备的检验更是时间管理、心态调节、临场应变能力的综合考验。基础扎实、心态稳定、节奏合理这三者缺一不可。秋招是一个漫长的过程笔试只是其中的一环。哪怕笔试没有通过也不要气馁后面还有很多公司和机会。重要的是在每次失败中总结经验在每次成功中积累信心不断调整自己的状态和策略。祝每一位正在备战校招的伙伴都能拿到满意的offer。
返回列表