ARTICLE DETAIL

资讯详情

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

华为机试2025真题复盘:三道编程题解析与备考策略

华为机试2025真题复盘:三道编程题解析与备考策略 1. 这场笔试到底在考什么华为开发岗暑期实习笔试圈子里习惯叫“华为机试”或者“OD机试”本质上是一套在线编程测评系统时长通常两小时三道编程题分值分布大致是100分、200分、300分总分600。过线标准一般是150分但不同年份、不同部门会有浮动有的年份卡100分有的年份卡200分这个后面细说。我参加的是2025年4月16日那一场考完之后在几个群里跟人对了一下发现题目风格跟前几年比有明显变化。以前华为机试偏重纯算法动态规划、图论、字符串处理是常客但这次明显往“工程实践”方向偏了题目描述更长场景更具体输入输出格式也更贴近实际开发中会遇到的数据处理任务。这个趋势值得后面准备的人注意。这场笔试适合谁看如果你是计算机相关专业、准备投华为暑期实习的大三或者研二学生那这篇内容就是给你写的。如果你已经工作几年想跳槽到华为社招机试环节同样适用只是社招的题目难度会再上一个台阶。哪怕你只是单纯想看看大厂笔试现在卷到什么程度也可以当个参考。我写这篇东西的出发点很简单网上关于华为机试的帖子不少但要么是几年前的老黄历要么是培训机构整理的模板化答案真正从考场出来、带着热乎记忆的复盘不多。我尽量把当时做题的思路、卡住的地方、后来想明白的解法都摊开讲包括一些我事后查资料才搞清楚的坑。2. 三道题的完整拆解与思路复盘2.1 第一题字符串压缩与解压的变体第一题通常是送分题100分但这次这个“送分题”有点意思。题目大意是给定一个字符串里面包含字母和数字要求按照特定规则压缩。规则是连续相同的字母超过两个时压缩成“字母出现次数”的形式但如果连续相同字母只有两个保持原样不压缩。数字字符直接保留不参与压缩逻辑。举个例子输入aaabbc3dddd输出应该是a3bbc3d4。注意这里aa只有两个所以不压缩bbb三个压缩成b3dddd四个压缩成d4。这个题看起来简单但有几个坑我当时差点踩进去。第一个坑是数字字符的处理题目说数字直接保留但如果你用正则或者状态机的时候不小心把数字也当成可压缩字符就会出错。第二个坑是“超过两个”这个边界条件到底是大于2还是大于等于2题目描述里写的是“超过两个”那就是大于2也就是三个及以上才压缩。第三个坑是压缩后的数字如果超过9怎么办比如连续15个a是输出a15还是a9a6题目没有明确说但根据常规理解应该是a15因为题目说的是“出现次数”没有限制位数。我当时的解法是用双指针一个指针遍历一个指针记录当前连续段的起始位置。遍历过程中统计连续相同字母的个数遇到不同字符或者数字就结算前一段。结算逻辑是如果连续字母个数大于2输出字母加个数否则原样输出。数字字符单独处理直接追加到结果里。代码大概长这样def compress(s): res [] i 0 n len(s) while i n: if s[i].isdigit(): res.append(s[i]) i 1 else: j i while j n and s[j] s[i]: j 1 count j - i if count 2: res.append(s[i] str(count)) else: res.append(s[i] * count) i j return .join(res)这个解法的时间复杂度是O(n)空间复杂度也是O(n)对于笔试来说完全够用。但我在考场上犯了一个低级错误一开始把count 2写成了count 2导致aa被压缩成了a2提交后报错改回来才过。这种边界条件在笔试里特别容易丢分建议后面准备的时候专门拿纸笔把边界情况列一遍。注意华为机试的判题系统对输出格式极其严格多一个空格、少一个换行都可能判错。第一题虽然简单但一定要把题目里的输入输出示例反复看三遍确认格式完全一致再提交。2.2 第二题任务调度与资源分配第二题200分难度明显上来了。题目描述是一个任务调度场景有N个任务每个任务有开始时间、结束时间和所需资源数。系统总共有M个资源同一时间所有运行中的任务所需资源总和不能超过M。要求计算出在给定时间范围内最多能同时运行多少个任务并输出这个最大数量。这个题本质上是一个区间调度加资源约束的问题。如果忽略资源约束那就是经典的“最多不重叠区间”问题用贪心按结束时间排序就能解。但加了资源约束之后就不能简单贪心了因为一个任务可能因为资源不够而无法运行但它的时间区间又跟其他任务重叠。我当时的思路是先把所有任务按开始时间排序然后用一个优先队列最小堆维护当前正在运行的任务的结束时间和资源占用。遍历每个任务时先把已经结束的任务从堆里弹出释放资源。然后判断当前剩余资源是否足够运行新任务如果够就加入堆同时更新最大同时运行任务数如果不够就跳过这个任务。但这个思路有一个问题跳过任务之后后面可能有资源更少、时间更短的任务但因为你已经跳过了前面的任务后面的任务可能因为时间重叠而无法运行。所以这个贪心策略不一定能得到全局最优解。后来我换了一个思路用回溯或者动态规划。但N的范围题目里没有明确给如果是N20那回溯可以如果是N1000那必须用更高效的算法。我考场上赌了一把N比较小写了回溯过了大部分测试用例但有一个超时了。事后我查了一下这个题的标准解法应该是用“扫描线贪心”或者“二分答案贪心验证”。扫描线的思路是把所有任务的开始和结束时间点排序然后从左到右扫描在每个时间点维护当前可用的资源数优先选择结束时间早且资源需求小的任务。二分答案的思路是二分最多能同时运行的任务数K然后验证是否存在一种调度方案能同时运行K个任务。这个题给我的教训是笔试里遇到这种“看起来像贪心但贪心不对”的题不要死磕贪心早点想别的路子。另外华为机试的测试用例通常不会太变态N的范围一般不会超过1000所以O(n^2)的算法通常能过但O(n^3)就悬了。2.3 第三题图论与最短路径的工程化包装第三题300分是整场笔试的分水岭。题目描述是一个网络拓扑场景有N个节点M条边每条边有延迟和带宽两个属性。要求找一条从起点到终点的路径使得路径的总延迟不超过D同时路径上的最小带宽尽可能大。输出这个最大化的最小带宽值。这个题本质上是“带约束的最短路径”或者叫“资源约束下的路径优化”。如果只有延迟约束那就是标准的Dijkstra把延迟当权重。但这里还要求最小带宽最大化这就变成了一个双目标优化问题。我当时的解法是二分最小带宽的值然后对于每个二分值只保留带宽大于等于该值的边在这个子图上跑Dijkstra看是否存在一条从起点到终点且总延迟不超过D的路径。如果存在说明这个最小带宽可行可以尝试更大的值如果不存在就减小最小带宽。这个思路是对的时间复杂度是O(log(maxBandwidth) * (M log N))对于笔试来说完全够用。但我在实现的时候犯了一个错误二分的时候没有处理好边界导致死循环。后来改成标准的左闭右开二分才过。代码框架大概是def max_min_bandwidth(n, edges, start, end, D): # 二分最小带宽 lo, hi 0, max(e[2] for e in edges) while lo hi: mid (lo hi 1) // 2 if check(mid): lo mid else: hi mid - 1 return lo def check(min_bw): # 只保留带宽min_bw的边跑Dijkstra # 返回是否存在总延迟D的路径 ...这个题的关键在于把“最小带宽最大化”这个目标转化成二分验证问题。很多人在考场上看到“最大化最小值”或者“最小化最大值”就懵了其实这类问题十有八九是二分答案。你只要把验证函数写对剩下的就是套模板。提示华为机试的第三题通常会有多个测试用例而且测试用例的规模可能很大。写代码的时候一定要注意输入输出的效率Python的话尽量用sys.stdin.readline不要用input()否则可能超时。3. 备考策略与时间分配3.1 刷题平台与题源选择华为机试的题目来源主要有几个渠道一是牛客网上的华为机试真题专区二是LeetCode上的华为标签题三是一些培训机构整理的题库。我个人的建议是优先刷牛客网上的真题因为华为机试的题目风格跟LeetCode不太一样LeetCode偏重纯算法华为机试偏重工程场景。牛客网上有一个“华为机试”的专题里面收录了近几年的大量真题而且有讨论区可以看到别人的解法和踩坑经验。我备考的时候把2023年和2024年的真题都刷了一遍大概有六七十道刷完之后对华为的出题风格就有感觉了。LeetCode上的话建议重点刷“动态规划”、“图论”、“字符串”这三个标签下的中等难度题。华为机试的难度大概在LeetCode中等偏上偶尔有一道困难。如果你LeetCode中等题能稳定在30分钟内AC那华为机试过线问题不大。3.2 时间分配与做题顺序华为机试的两小时我建议这样分配第一题20分钟第二题40分钟第三题50分钟剩下10分钟检查。但这个分配不是死的要根据题目难度灵活调整。做题顺序上我强烈建议按顺序做不要跳着做。因为华为机试的题目难度是递增的第一题最简单第三题最难。如果你先做第三题可能卡住了浪费时间导致第一题没时间做。而且华为机试的判题是实时反馈的你提交之后马上能看到通过率如果第一题就卡住了心态容易崩。我当时的实际时间分配是第一题15分钟做完第二题花了35分钟第三题花了50分钟最后20分钟在调第三题的边界条件。整体节奏还算稳但第三题最后有一个测试用例没过估计是边界没处理好。3.3 编程语言的选择华为机试支持多种编程语言包括C、C、Java、Python、JavaScript等。我选的是Python因为写起来快而且华为机试的题目对性能要求不算特别苛刻Python通常能过。但Python有一个问题如果题目规模很大比如N10^5那Python可能会超时。这种情况下C是更稳妥的选择。我认识一个哥们儿他Python写第三题超时了换成C重写一遍就过了。所以如果你时间充裕建议准备两套语言Python用来快速写简单题C用来啃硬骨头。Java的话华为内部用得比较多但笔试的时候用Java写代码比较啰嗦时间上可能吃亏。JavaScript不太推荐因为华为机试的JavaScript环境有时候会有坑比如Node版本不对导致某些API不能用。4. 考场上的实战技巧与避坑指南4.1 输入输出的处理细节华为机试的输入输出格式非常严格而且不同题目的输入格式可能不一样。有的题目是单组输入有的是多组输入有的是以EOF结束有的是以特定字符结束。你在写代码之前一定要把题目里的输入输出示例看清楚。我当时的做法是先把输入输出示例复制到本地然后写一个简单的解析函数把示例输入解析成程序能处理的数据结构再手动跑一遍确认输出跟示例一致。这个步骤看起来多余但实际上能帮你省下大量调试时间。另外华为机试的判题系统对输出的末尾换行很敏感。有的题目要求输出末尾有换行有的不要求。如果你不确定就统一加上换行通常不会错。4.2 测试用例的调试方法华为机试的判题系统会给出每个测试用例的通过情况但不会告诉你具体是哪个输入错了。所以你需要自己构造测试用例来调试。我的习惯是写完代码之后先用手动构造的边界用例跑一遍比如空输入、单个元素、最大规模输入等。然后如果提交后发现有测试用例没过就根据通过率反推可能的错误原因。比如通过率是80%那可能是某个边界条件没处理好通过率是0%那可能是输入解析就错了。还有一个技巧如果题目允许可以在代码里加一些打印语句把中间结果输出到stderr这样判题系统不会判错但你能在本地看到调试信息。不过华为机试的在线编辑器不一定支持stderr这个要看你用的平台。4.3 心态调整与应急方案笔试的时候心态很重要。我见过很多人第一题卡住了就慌了后面两道题直接放弃。其实华为机试的过线分数不高通常150分就够也就是第一题100分加第二题做出一半就差不多了。所以即使第一题没做完也不要放弃后面的题。如果遇到完全没思路的题先写一个暴力解法上去哪怕只能过部分测试用例也能拿点分。华为机试的评分是按测试用例通过率给的不是全有全无。所以能拿一分是一分。还有一个应急方案如果时间快到了但代码还没写完先把已经写好的部分提交上去看看能过多少。有时候你觉得自己没写完但实际上核心逻辑已经对了只是边界没处理提交后可能能过大部分用例。5. 常见问题速查与经验总结5.1 高频问题与解决方案对照表问题现象可能原因解决方案提交后通过率0%输入解析错误或输出格式不对检查输入输出示例确认格式完全一致部分用例超时算法时间复杂度过高优化算法或用C重写部分用例答案错误边界条件未处理构造边界用例如空输入、单元素、最大值代码本地能跑但提交报错平台环境差异检查语言版本避免使用平台不支持的API第三题完全没思路题目类型不熟悉先写暴力解法拿部分分再想优化5.2 我踩过的坑与事后反思第一个坑是过度依赖模板。我备考的时候背了一些动态规划和图论的模板但考试的时候发现题目稍微变一下形模板就不适用了。比如第三题我一开始想套Dijkstra模板但题目要求的是“最小带宽最大化”不是标准的最短路径。后来我花了不少时间才想明白要用二分。第二个坑是忽略了题目里的隐含条件。第二题的任务调度题目里说“同一时间所有运行中的任务所需资源总和不能超过M”我一开始理解成了“每个任务单独不能超过M”导致思路完全跑偏。后来重新读题才发现是总和约束。第三个坑是时间管理不当。我在第二题上花了太多时间导致第三题只剩50分钟虽然最后做出来了但没时间检查边界条件。如果重来一次我会在第二题卡住超过30分钟的时候果断跳过先做第三题因为第三题的分值更高。5.3 给后来者的几条实在建议第一提前一个月开始准备每天刷2-3道题保持手感。华为机试的题目不难但需要熟练度临时抱佛脚效果不好。第二重点刷近两年的真题不要刷太老的题。华为的出题风格每年都在变老题目的参考价值有限。第三考试的时候带一张纸和一支笔遇到复杂的题目先在纸上画图、列公式比在脑子里空想效率高得多。第四如果条件允许找一两个同学一起备考互相讲题、互相出测试用例比一个人闷头刷题效果好。第五考试前一天早点睡别熬夜。华为机试两小时高强度脑力劳动精神状态不好很容易犯低级错误。最后说一个我自己的体会华为机试的题目虽然包装得很工程化但剥开外壳核心还是那些经典的算法和数据结构。你只要把基础打牢遇到新题的时候能快速识别出它考的是什么剩下的就是写代码的事了。我考完这场笔试之后最大的感受不是题目有多难而是自己平时练得还不够多有些题明明见过类似的但考场上就是没想起来。所以刷题这件事真的没有捷径。
返回列表