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

资讯详情

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

深入拆解小米2019秋招软件开发笔试题A卷

深入拆解小米2019秋招软件开发笔试题A卷 小米2019秋招软件开发笔试题A这个标题我在网上刷到过不止一次自己也拿它当过模拟练习。说实话这套题放在当年属于比较典型的互联网大厂开发岗笔试难度不算变态但覆盖面很广涉及数据结构、算法、操作系统、计算机网络、数据库、编程语言基础甚至还有一点逻辑题。很多人一看到“2019”就以为过时了但实际上面试官看重的基础能力、解题思路、代码规范到今天依然没变。我见过不少同学把这套题当作秋招前的摸底试卷来刷效果很好。这篇内容我就结合自己刷题和带人备考的经验把A卷的考点拆开揉碎讲清楚如果你正在准备软件开发方向的校招或者想检验一下自己的计算机基础这篇应该能帮到你。1. 整体设计与考察思路拆解1.1 小米笔试题的“性格”是什么小米的软件开发笔试在我做过的十几家互联网公司里属于“务实型”。它不搞偏题怪题更不会像某些公司那样出脑筋急转弯。它的核心目的是在有限时间内筛出那些基础扎实、代码能力过关、能快速上手干活的人。这里要理解一个关键逻辑笔试不是用来考倒你的而是用来建立“区分度”的。A卷的题目通常分三档——基础题保证大多数人会做、中等题区分掌握程度、拔高题筛选顶尖候选人。所以如果你在考场上发现前面题目比较顺利后面突然卡住那很正常说明你已经进入筛选区了。A卷的整体结构一般是单选题 多选题 编程题偶尔会加简答题。单多选覆盖计算机基础知识编程题考察算法手写能力。整套题的时间一般是90到120分钟题量不小所以时间管理本身就是隐性考点。1.2 为什么这套题值得反复做很多人问2019年的题现在刷还有意义吗我当时也这样想过但真正刷完发现计算机基础核心知识的变化是极其缓慢的。操作系统的进程调度算法、TCP三次握手、HashMap的底层原理、SQL的索引优化这些到现在依然是高频考点。小米这套A卷的价值在于它题目选得比较中规中矩能很好地暴露你的知识盲区。我建议把做这套题当成一次“体检”而不是“押题”。你做完后应该关注的不是分数而是错题分布在哪些章节。比如如果你发现自己数据库相关的题错了一半那你接下来两个星期就该猛补索引和事务隔离级别。用一套有代表性的题目来诊断自己的知识体系比盲目刷一百道题更有效。2. 数据结构与算法笔试的重头戏2.1 高频算法题型盘点从A卷和同类互联网公司笔试来看算法题的考点高度集中。第一类就是排序和查找尤其是快速排序、归并排序、二分查找的变种。第二类是链表操作比如反转链表、判断环、合并有序链表。第三类是二叉树层序遍历、最近公共祖先、路径总和这类题目出现频率极高。第四类是动态规划背包问题、最长公共子序列、爬楼梯等经典模型。第五类是哈希表与字符串比如两数之和、无重复字符的最长子串。你会发现这些题并不“新”但恰恰是这些基础题最能反映一个人的代码功底。面试官不是想看你背没背过题而是看你在紧张状态下能否写出边界正确、逻辑清晰的代码。2.2 典型题目复盘从读题到AC的完整思考我以一道当年A卷风格非常接近的题为例给定一个整数数组和一个目标值找出数组中和为目标值的两个数返回它们的下标。很多同学一看这道题立刻写两层for循环提交后却发现性能不达标。这里其实有两个层面的优化思路。第一层是正确的暴力解def two_sum(nums, target): n len(nums) for i in range(n): for j in range(i 1, n): if nums[i] nums[j] target: return [i, j] return []这个解法时间复杂度O(n^2)空间O(1)。优点是代码简单、不容易错笔试时如果没时间优化至少能拿部分分。第二层是哈希表解法def two_sum(nums, target): seen {} for i, num in enumerate(nums): complement target - num if complement in seen: return [seen[complement], i] seen[num] i return []时间复杂度降到O(n)空间O(n)。这里有个关键细节必须先判断补数是否存在再把当前数存入哈希表。如果先存入再判断会出问题吗以nums[3,2,4],target6为例如果先存入3再遍历到3时会发现3在表里直接返回[0,0]显然是错的。这就是典型的贪图代码简洁而忽略边界条件的失误。我在实际笔试中见过太多人倒在这个细节上。所以刷题时不要只追求“能跑”要追问自己每个存储和判断的时机是否合理边界情况有没有覆盖空数组、重复元素、负数怎么办这才是笔试真正考察的能力。2.3 编程题答题规范与提交技巧编程题除了算法本身答题规范也直接影响得分。我总结了几条血泪经验。第一先写思路再写代码。很多在线笔试系统支持提交前写注释或者在代码里简单说明你的算法复杂度和核心思路这能帮助阅卷人理解你的代码即使没AC也可能给过程分。第二注意输入输出格式。有些题目要求输出结果占一行有些要求空格分隔。格式错误直接判错即使算法对了也拿不到分。我建议考试前先做个简单的“读取多行输入并输出”的练习把input()、sys.stdin.readline()的用法烂熟于心。第三控制调试时间。很多在线编程环境支持本地调试但如果你在提交前反复试错超过15分钟那不如先跳过去做后面的题目。笔试是整体战不要在一道题上死磕。第四多写辅助函数。比如链表题可以先写一个print_list(head)的辅助函数在调试和验证时特别方便。这个习惯在LeetCode刷题时可能感觉不到但在笔试环境里能显著提高效率。3. 操作系统与计算机网络选择题送分还是送命3.1 操作系统高频考点详解A卷的操作系统题绕不开进程与线程、死锁、内存管理、文件系统这几块。每次考完总有人说“操作系统很简单”但也有相当多的人在这里丢分原因是概念混淆。进程和线程的区别是必考的。这里有一个便于记忆的类比进程像一家餐厅每个餐厅有自己的厨房、食材和座位独立的内存空间和资源线程像餐厅里的服务员共享这个餐厅的厨房和食材但每个人各干各的活。所以进程是资源分配的基本单位线程是CPU调度的基本单位。问“同一进程内的线程共享什么不共享什么”答案里“共享堆和方法区、不共享栈和寄存器”这类选项要能快速分辨。死锁的四个必要条件互斥、持有并等待、不可剥夺、循环等待也是常客。常见考法有两种一种是给一段并发代码问是否可能死锁另一种是考死锁避免算法比如银行家算法。我建议把四个条件的英文名记一下Mutual Exclusion、Hold and Wait、No Preemption、Circular Wait因为有些题目会直接用英文术语。内存管理里虚拟内存和页面置换算法是重点。FIFO、LRU、OPT这三种置换算法一定要会手算。我当年常搞混LRU和LFU这里分享一个区分技巧LRULeast Recently Used看的是“多久没被用”LFULeast Frequently Used看的是“被用的次数少”。一个是时间维度一个是频率维度。3.2 计算机网络高频考点与易混淆概念网络部分TCP和UDP的对比几乎是必考。你至少要记住TCP面向连接、可靠、有序、基于字节流、有拥塞控制和流量控制UDP无连接、不可靠、无序、基于数据报文、开销小。然后要能解决实际问题比如“视频通话适合用TCP还是UDP”很多人误以为要追求可靠而选TCP但实际上视频通话对实时性要求高能容忍偶尔丢帧所以通常使用UDP或基于UDP的协议如RTP。TCP三次握手的过程要能画出状态图同时能回答“为什么两次握手不够”因为两次握手无法防止旧的连接请求突然传到服务器导致服务器端资源浪费。四次挥手的TIME_WAIT状态也是老考点要知道主动关闭方会进入TIME_WAIT并等待2MSL原因有两个一是确保最后一个ACK能到达对方二是让过期数据包在网络中消失。HTTP状态码也是一个很实用的考点。200、301、302、400、401、403、404、500、502、503这些要能说出含义。我见过有人分不清401和403其实401是未认证403是已认证但无权限。这就像进小区401是“你没刷门禁卡”403是“你刷了卡但你不住这栋楼不让你进”。DNS解析的流程也常考尤其是递归查询和迭代查询的区别。你可以在纸上画一画客户端问本地DNS服务器本地DNS服务器问根DNS服务器、顶级域服务器、权威DNS服务器的过程分清每一步是递归还是迭代。4. 数据库与编程语言细节决定成败4.1 数据库设计题与SQL题数据库的题目通常是两类一类是给了表结构和查询需求让你写SQL另一类是给了业务场景让你设计表结构。A卷的SQL题难度适中但很爱考聚合函数和分组过滤。比如最典型的查询每个部门的员工平均工资但只显示平均工资大于5000的部门。很多人一上来就写WHERE AVG(salary) 5000然后报错因为聚合函数不能放在WHERE子句里。正确写法是SELECT dept_id, AVG(salary) AS avg_salary FROM employee GROUP BY dept_id HAVING AVG(salary) 5000;这里的关键知识点是WHERE和HAVING的区别WHERE是对分组前的行进行过滤HAVING是对分组后的组进行过滤。这个点能刷掉一批人因为平时练习太少一到手写SQL就容易凭印象写。索引相关的题目也很常见。比如“给一个查询语句如何建立索引”这需要理解最左前缀原则。假设有联合索引(a, b, c)那么查询条件里只要包含a就能用到这个索引如果跳过a直接查b或c索引就失效了。这就像查字典你先查部首再查笔画如果只给我笔画我就没办法用部首目录快速定位。还有事务隔离级别四个级别要背熟读未提交、读已提交、可重复读、串行化。要能解释各自的并发问题和现象比如脏读、不可重复读、幻读分别在哪个级别下可能发生。MySQL默认是可重复读这个知识点也经常和InnoDB引擎一起考。4.2 编程语言细节题Java和C谁更爱出题小米的软件开发笔试题型里语言部分通常不是针对某一种语言而是考察通用的编程概念但会用你熟悉的语言来描述。如果你主攻Java那要重点复习重载和重写的区别、抽象类和接口的区别、HashMap的底层实现数组链表红黑树、并发编程中的synchronized和volatile、垃圾回收的基本流程。如果你主攻C那要重点复习指针和引用的区别、内存管理栈上变量和堆上变量、构造函数和析构函数的调用顺序、虚函数和多态的实现机制、STL容器的时间复杂度。这里我想多说一句不要试图在笔试前临时换语言。我见过太多同学觉得Java笔试考得多于是用Java投简历其实自己一直写的是Python。结果笔试时ide自动补全用不惯基本库记不清反而发挥失常。笔试时选择自己最熟练的语言最重要因为面试官看重的是你解决问题的能力而不是语言本身。另外面向对象设计类的题目偶尔会出现。比如“请设计一个停车场系统包含类、接口、主要方法”。这类题不是让你写完整代码而是看你的抽象能力。我建议按这个思路回答先定义抽象类或接口比如Vehicle、ParkingSpot再设计具体类Car、Motorcycle最后补充核心方法parking、leave、isFull。如果能顺手提一下用到什么设计模式工厂模式、单例模式就更容易拿高分。5. 备考策略与实战技巧5.1 一份可执行的刷题路线如果你现在距离秋招还有两个月可以参考我的一套复习路线不一定非得照搬但核心逻辑是这样的。第一个星期到第二个星期重点刷“数据结构基础”。线性表、哈希表、栈、队列、二叉树、图。每类数据结构至少手写一遍基本操作比如链表的创建、插入、删除、反转。很多笔试编程题本质上就是在这些基础操作上套一层业务逻辑。基础操作不熟后面写题会非常痛苦。第三个星期到第四个星期主攻算法思想。分治、回溯、动态规划、贪心、二分。建议每种算法找10道左右的经典题来做。比如动态规划就做爬楼梯、零钱兑换、最长递增子序列、编辑距离回溯就做全排列、组合总和、N皇后。每道题不要看一眼题解就过要自己先想20分钟想不出来再看。这20分钟的思考过程就是考试时解题思路的来源。第五个星期开始进入“刷整套真题”阶段。每周至少1到2套完整的笔试题目严格按照考试时间来做。这里有个关键点不管这套题是哪个公司的都要当成真实考试对待中间不要翻书、不要暂停。做完后再统一对答案和复盘。复盘的效率比做题的效率更高因为你能发现自己是在哪些知识点上系统性地薄弱。5.2 笔试现场的时间分配策略A卷这种题量我建议采用“三轮答题法”。第一轮快速扫描全部题目用5分钟把选择题中一眼就会的题先做掉不会的题标记出来。这样做的好处是能确保把容易拿的分先装进口袋。编程题方面先看题目类型把最有把握的题放在第一轮做。第二轮集中攻克标记的选择题和第一道编程题。选择题思考时间不要超过2分钟一道编程题最多40分钟一道。如果卡住了立刻跳到下一题。第三轮回头处理第二轮的剩余题。这个时候你已经完成了大部分题目心态会稳很多也许就能想出刚才卡住的解法。如果还有时间再检查一遍选择题中那种“以下说法错误的一项是”的题目圈出关键词防止看错。整个答题过程中最重要的一条原则是不要空题。选择题不会也要蒙一个编程题写不出完整代码也要写出部分步骤和思路。很多系统是按测试用例给分的你写了一半的代码也许能过一两个用例得一两分这一两分就可能让你从面试名单外滑进名单内。5.3 高效复盘把一套题吃成三套题很多人刷题只做一遍对完答案就扔这是效率极低的行为。一套高质量的笔试题至少要消化三轮。第一轮对答案记录错题搞清楚正确答案为什么对。只看解析还不够最好能自己给自己讲一遍。如果你能把一道题完整地讲给一个完全不懂的人听而且他听懂了那你才是真懂了。第二轮把错题背后涉及的知识点整理成一张“错题地图”。比如你在“TCP三次握手”上错了那就把TCP相关的所有高频考点都过一遍。通过一道题带出一个知识块这叫“以题带面”。第三轮一周后把做错的题重新做一遍。如果还是错说明你上次压根没真正理解。这时候不能只记答案要找同类题目再练几道。直到你能不看解析独立写出正确解法这道题才算真正消化。我个人体会是认认真真消化一套A卷胜过囫囵吞枣刷十套题。特别是对基础薄弱的人来说贪多嚼不烂稳扎稳打才是最快的路径。6. 常见问题与避坑技巧实录6.1 笔试中那些让人后悔的丢分点我监考过几次模拟笔试也带过不少学弟学妹发现有几个丢分点年年有人踩。第一个是选择题的“反向陷阱”。很多题问的是“以下哪项不正确”“以下哪个不是”。考试时人一紧张目光扫过选项看到熟悉的就立刻选了根本没注意题目问你的是“不是”。解决方法是把“不正确”“不是”“不包含”这种否定词圈出来或者在做题前先默念一遍题干比直接读选项更有用。第二个是编程题的“无输入读取”错误。有些题目给的输入是多行但很多新手只会用input()读一行。比如第一行是数组长度第二行是数组本身有些人就直接把两行数据割裂对待了。这里要养成习惯拿到题先确认输入格式再看题目要求。必要时写一个简单的读取模板比如import sys if __name__ __main__: data sys.stdin.read().strip().split()这样做的好处是无论输入是空格分隔还是换行分隔都能一键读取所有数据再按需解析。第三个是SQL题不写分号。很多在线笔试的SQL判题系统如果没有分号可能判错。平时练习时多留意这些细节考试才能少踩坑。第四个是时间耗尽却忘了提交。这个听起来很蠢但我真见过好几次。一些笔试平台需要手动“交卷”如果你一直停留在编程题页面里没点提交最后系统自动交卷可能代码还没保存。所以建议每做完一道题就立即点击“保存”或“提交本题”。6.2 如何在压力下保持正常发挥笔试时的心态往往比你知道多少知识更重要。我见过很多复习得很好的同学一到限时模拟就大脑空白最后成绩远不如平时。这里分享三个缓解笔试紧张的方法。第一刻意训练限时感和节奏感。在平时刷题时就用计时器给自己制造一种轻微的紧迫感。当你次次都在这个状态下做题大脑会逐渐适应到正式笔试时就不会因为时间压力而慌乱。第二建立“先易后难”的自信循环。考试开始后先做几道简单题每做对一道都在心里给自己一个正反馈。这种感觉能抵消面对难题时的焦虑让大脑保持活跃状态。第三如果编程题实在做不出来尝试写“伪代码思路注释”。比如你卡在动态规划的状态转移方程那你可以把状态定义写出来把递推关系的思路用中文注释写出来。这些内容虽然不能通过测试用例但能让阅卷人看到你的思考过程在主观题部分有可能拿到同情分。6.3 考后应该立刻做什么笔试结束的那一刻很多人的第一反应是“终于可以放松了”。但我要泼一盆冷水如果你真的想拿到面试资格考后两小时的“黄金复盘期”很重要。趁你还记得原题立刻把题目和你的作答情况记录下来。尤其是编程题尽量默写出你当时的思路和代码。这些题目很可能在牛客网、LeetCode讨论区出现你可以对照大神的题解寻找更优解法并思考自己当时为什么没想到。这个动作能让一套题的价值最大化。另外一个实用技巧是给每道题标注“考点标签”。比如这道题考了“数组哈希表”那道题考了“TCP状态转换”。等到下一次笔试前你只需要翻看这些标签就能快速知道哪些知识点需要重点突击而不是从头到尾地再复习一遍。根据我个人经验拿到BAT、小米这类公司的笔试offer靠的不是押题而是把基本功练扎实、把答题节奏掌握好、把心态调整稳。这套2019年的A卷虽然年份久了点但它所代表的基础能力考察方向在今天的秋招中依然完全适用。希望这篇拆解能帮你少走一些弯路在你真正坐在考场上的时候心里是踏实的。
返回列表