
先交代一句这篇稿子不是给你列一堆题号就完事的而是把我自己刷华为OD机试从懵到熟的过程、踩过的坑、整理出来的算法分类清单以及怎么用一套思路举一反三的方法都摊开来讲。无论你是刚准备投OD的应届生还是社招转岗想摸底的老手只要照着这个框架走至少在机试这一关不会慌。很多人一听“华为OD机试”第一反应是“外包岗还要考算法”——确实要考而且考得还不算浅。ODOutsourcing Developer虽然从用工性质上跟正式编有区别但机试环节的筛选标准并不低尤其是近两年题目难度和题量都在往上走。机试通常是在牛客网或华为自己的考试平台上完成一共三道题分值大致是100分、200分、300分总时长两个半小时左右。你不需要AC全部三道题但总分和通过率直接决定你能不能进入后面的技术面。换句话说机试是OD所有环节里最硬的一道门槛没有任何水分可以挤。我的建议是把机试当成一场“有范围的算法竞赛”来准备不要漫无目的地刷题。OD机试的题库虽然不公开但它考察的算法类型高度集中并且很多题目都能在LeetCode、牛客、Codeforces等平台找到相似题。下面这份清单就是我从历年真题回忆帖、题库整理、以及自己实际考试反馈中总结出的高频考点。按算法分类列好每一类我都标注了掌握优先级、典型题型和举一反三的思路。1. 先搞清楚OD机试到底考什么、怎么判分1.1 考试形式与常见流程OD机试目前主流的考试流程是考前一到两天会收到邮件或短信里面有考试链接和注意事项。考试时长为150分钟通常三道题难度从简到难排序。第一题偏基础考察字符串处理、数组操作、简单模拟第二题开始上强度往往涉及贪心、动态规划、二分搜索或图论基础第三题就是压轴题常见的是复杂模拟、高级动态规划、拓扑排序、最短路径变种等。分值分配一般是100、200、300总分600分。根据我了解到的情况大部分岗位的机试合格线在150到200分左右部分热门部门或大模型相关岗位可能会更高而且越好的部门越看重第三题的完成度。这里要特别提醒一个点OD机试的判题系统对输入输出格式要求非常严格。很多人在LeetCode上刷题习惯了核心代码模式到了OD机试的ACM模式一下就懵了——需要自己处理输入解析、输出格式、甚至多组数据循环读取。这不是危言耸听我见过不少代码逻辑完全正确、但因为在牛客网笔试环境下没处理好输入而0分的案例。所以备考时一定要提前去牛客网的“华为OD机试”专区做几套模拟题把while (cin n)这种输入读取方式练熟。1.2 判分逻辑与时间分配策略机试的判分逻辑通常不单纯看最终通过率有些题目是按测试用例的通过比例给分的。也就是说即使你做不出完整解法暴力解法能过一部分用例也能拿到部分分数。这个特性决定了我们的答题策略先保分再冲刺。我的时间分配方法是第一题尽量在20到30分钟内搞定第二题花40到50分钟第三题至少留出50分钟。如果某道题卡了超过15分钟没有任何思路果断先跳到下一题回头再补。另外第三题通常有部分数据量很小、适合暴力解的测试用例哪怕你只写一个最朴素的DFS加剪枝或纯遍历能过20%的用例也是实打实的分数。记住机试的目标是总分最大化不是表演完美解法。提示考试时如果题目明确给出数据范围比如n 1000那就老老实实想O(n^2)甚至O(n^3)的解法如果n 10^5你还在用双重循环大概率会超时得立刻转二分、双指针、贪心或动态规划的思路。2. 算法分类盘点一张清单把高频考点串起来我一直觉得刷题最忌讳按题号顺序无脑刷。正确做法是按算法类型分块突破把一个类型的套路吃透再换下一个类型。下面这四类基本能覆盖OD机试95%以上的考点我按优先级从高到低列出来。2.1 第一梯队基础数据结构与字符串操作——保命题这一类属于“必拿分”的板块主要考察数组、链表、栈、队列、哈希表、字符串的基本操作。OD机试第一题几乎都从这里出而且第二题的某些前置步骤也依赖这些基础能力。数组双指针遍历、滑动窗口、前缀和、差分数组。字符串子串匹配、字符频率统计、字符串反转、分割与拼接。哈希表两数之和变种、字母异位词分组、出现频率统计。栈和队列括号匹配、表达式求值、单调栈下一个更大元素、循环队列模拟。以“查找幸运数”这类题目为例后面我会单独拆解它本质上就是字符串处理加小模拟。你不需要任何高级算法能熟练操作字符串和数组就能拿满第一题的分。2.2 第二梯队排序与查找——性价比之王排序和查找是第二题的高频考点而且它们往往是其他算法的前置工具。OD机试里直接考“实现某个排序算法”的概率不高但它会考“按某种规则排序后取结果”“利用有序性做二分查找”这类间接使用。排序快速排序、归并排序、堆排序重点掌握Arrays.sort()/sort()的底层排序规则以及如何自定义比较器。有些题会卡String排序的字典序规则尤其是数字字符串排序比如[3, 30, 34]排成最小数这个是经典题。二分查找这是OD机试的第二题和第三题“亲儿子”后面我会详细讲。核心不只是会写模板而是要能看出来“答案具有单调性可以二分答案”。优先队列堆解决“前K大/小”、“第K大/小”、合并K个有序链表这类问题非常高效。冒泡排序这类最基础的排序虽然考的概率低但我也建议你手写一遍。不是因为它会直接考而是它能帮你巩固循环和交换的逻辑这种基础能力在紧张状态下很容易掉链子。2.3 第三梯队图论与搜索——第二题和第三题的分水岭图论和搜索类题目是拉开差距的地方也是OD机试第二题和第三题的高频出题点。如果你能稳定写出DFS、BFS、拓扑排序、最短路径那么你通过机试的概率会大幅提升。图的表示邻接矩阵和邻接表OD机试里很多题不会直接告诉你“这是一张图”而是以“城市间道路”“任务依赖关系”“文件依赖编译顺序”等方式出现。你需要自己抽象成图。DFS连通块问题、岛屿数量、全排列、组合、棋盘类搜索。BFS最短路径、迷宫问题、逐层扩散类问题。注意BFS常用于无权图的最短路。拓扑排序典型场景是“课程表”类任务调度题对应热词里的“货物调度”“任务编排”。Kahn算法用队列实现要非常熟。最短路径Dijkstra算法是OD机试里常客通常与“最小花费”“最短时间”绑定。堆优化的Dijkstra要能默写。并查集判断连通性、求连通分量数量OD机试偶尔会考比如“朋友圈”“网络连接”问题。2.4 第四梯队动态规划与贪心——压轴题主力动态规划DP和贪心算法是第三题的绝对主力。OD机试的压轴题很少考裸DP几乎都是披着业务场景外衣的DP变种比如“机器人走格子”“最大子数组和”“01背包”“最长递增子序列”。线性DP最大子序和、最长上升子序列、最长公共子序列。背包问题01背包、完全背包、多重背包需要掌握“滚动数组”优化法。区间DP矩阵连乘、石子合并。状态压缩DP偶尔出现量力而行。贪心区间调度、分发饼干、跳跃游戏、加油站。贪心往往和排序一起用先排序再按某种规则决策。需要提醒的是DP题在考试时最大的难点不是状态转移方程本身而是你能不能识别出“这题能用DP”。我自己的方法是看到求“最大/最小/方案数”并且数据范围在10^3到10^5之间优先往DP方向想。如果可以从左到右递推、每个状态跟前面的状态相关那大概率就是DP。另外树形DP和记忆化搜索DFS备忘录在OD里也开始出现记忆化搜索其实是很多DP题的另一种写法理解上更直观建议至少掌握一种。3. 高效刷题方法论三轮刷题法与举一反三技巧光有清单还不够你还得知道怎么用这份清单。我首推“三轮刷题法”配合“一题三做”的训练方式能让你在有限时间内拿到最大提升。3.1 三轮刷题法怎么安排备考周期第一轮是“按类型扫盲期”大概花5到7天。这一轮不追求难度重点是每个算法类型都过一遍基础题。比如今天专门刷字符串和数组明天刷二分后天刷DFS/BFS大后天刷贪心和DP。目标是看到题目能说出它属于哪个类型、大概用什么解法形成“算法直觉”。这一轮不需要计时但每道题都要自己写代码不能只看题解。第二轮是“计时实战期”花5到7天。每天做一套3道题严格限时150分钟模拟真实考试环境。做完之后认真复盘重点分析时间花在了哪里哪类题目卡住最久。这时你会发现自己的薄弱环节非常清晰比如有人字符串处理慢有人抱怨DP完全没思路。后续的练习就针对这些薄弱点进行专项补强。第三轮是“难度拔高期”花3到5天。这轮专门做真题回忆版和高频难题重点训练第三题的解题思路。OD机试真题在牛客网、CSDN、博客园上有很多人分享但题目描述可能不太准确做完后不用太纠结原题关键是看它考察的核心算法是什么然后找同类题练。3.2 举一反三的具体套路以二分算法为例很多人说“我会写二分模板但考试时就是看不出来哪里能用二分”。这是刷题量不够导致的典型症状。我告诉你一个判断标志如果题目要求你“求某个值的最小值/最大值”而且容易验证某个候选值是否可行那么这个题八成可以二分答案。比如典型的“查找幸运数”题——从某个正整数集合里找满足特定条件的数字或者“货物装载”题——判断在给定载重能力下能否在限定时间内运完所有货物。这类题都是先猜一个答案比如载重能力x然后写一个check(x)函数去验证如果check(x)可行就尝试更小的x不行就调大x。这种思路一旦掌握你就等于解锁了一整类“最值问题”的通用解法。举一反三还有一个很实用的做法每做完一道题就主动联想“这道题改个条件还能怎么考”。比如“两数之和”改一改就能变成“三数之和”、“和为K的子数组”“岛屿数量”可以变成“岛屿的最大面积”“岛屿的周长”“合并区间”可以延伸成“插入区间”“会议室II”。这种联想训练可以让你一道题顶十道题。4. 真题场景模拟与思路拆解这一章我从热词里挑了两个具象化的真题场景分别对应前文提到的“二分答案”和“图论/拓扑”两个方向。大家刷机试题时很容易搜到“查找幸运数”“货物调度”这类题目关键词这里就把思路完整过一遍。4.1 场景一查找幸运数——字符串处理与整数运算的综合题题目大意一般是给定一个整数n找出不大于n的最大“幸运数”。所谓“幸运数”通常是所有数位都是某个特定数字比如4和7或者6和8。这类题在OD机试中出现频率很高因为它可以考察字符串遍历、字符比较、整数转字符串等基础能力。我的建议解法是贪心加字符串处理而不是暴力遍历。先判断n的位数如果n的位数是k那么所有k位幸运数都大于任何k-1位幸运数。然后从最高位到最低位逐位处理当前位如果大于目标数字就选一个较小的幸运数字并将后面所有位补成最大幸运数字当前位如果等于目标数字就继续看下一位当前位如果小于目标数字说明该位只能选更小的幸运数字后面全补最大幸运数字。整个逻辑就是“从高位贪心保证结果尽量大且不超过n”。这道题能延伸出很多变种找不小于n的最小幸运数、找第k个幸运数这是典型的BFS/二叉树层序遍历题、用动态规划求某个区间内幸运数的个数等。所以刷题时我会在笔记里专门记录这种“一个场景衍生出多个考点”的题目。4.2 场景二货物调度/装载问题——二分答案与优先队列的经典组合热词里的“货物调度”“货物”对应的往往是运输、分配、装载类问题。最典型的考题是给定一批货物的重量或体积以及货车的载重限制问最少需要多少辆车能装完或者反过来给定车辆数每辆车载重相同问能承载的最大载重量至少是多少。如果题目要求“最少车辆数”那其实就是贪心加排序先按货物重量从小到大或从大到小排序然后用双指针重的跟轻的搭配能塞进同一辆就一起走不能塞进的单独一辆车。这里要注意装载顺序本身可能有限制如果题目说“货物必须按顺序装车”那就不能用这个双指针法了得用优先队列或模拟最小化卡车的等待时间。如果是“给定车辆数求最大载重量”这种最值问题就用前面提到的二分答案。设载重能力为mid然后写一个check(mid)函数判断在每辆车载重不超过mid的情况下能否用给定的车辆数装完所有货物。这个check函数内部通常就是一个简单的贪心模拟按顺序或按规则把货物装进当前车辆装不下就换下一辆。如果总车辆数超过限制说明mid太小否则尝试更小的mid。这个题型的考点非常综合覆盖了二分、贪心、数组遍历近几年在OD机试里出现频率相当高。这类题我还想多说一句考试时遇到实践题先把输入输出、数据范围读明白再思考模型。如果你把业务场景成功抽象成算法问题基本上就已经赢了80%。5. 常见问题与排查技巧实录备考和考试过程中你会遇到一堆乱七八糟的问题不是只有“题不会做”这一个坎。下面这张表是我自己备考时整理的“OD机试常见问题速查”从刷题策略到考试翻车现场都有涉及希望对你有用。常见问题现场表现排查思路与建议输入输出处理不当本地运行正常提交后0分或部分通过确认题目是否为ACM模式检查是否按行读取、是否有多余输出。考前用牛客网平台模拟练习3次以上超时TLE测试用例跑了很久最后超时看到n 10^5之类的大数据量立刻放弃暴力解法转为二分、双指针、哈希优化、O(n log n) 级别的算法递归栈溢出用DFS时程序崩溃确认数据量是否适合递归。递归深度超过几千就改用显式栈或BFS必要时用“记忆化搜索”维度来降低重复计算边界条件漏判大量测试用例过不去尤其注意空数组、单个元素、n1、nums长度为1、字符串为空、数字为0或负数、溢出问题。写代码前先在注释里列全边界条件审题不清做完发现跟题意不符读题至少两遍划出关键限定词如“必须按顺序”“不要求连续”“可以重复”等。OD题目经常有隐藏条件比如排序规则、字典序要求贪心判断失误结果差一点点有些题表面像贪心实际要用DP。可以先用暴力回溯验证小数据下的答案再考虑能不能贪心。如果不能确定优先写DP或记忆化搜索考试时间分配失衡第一题耗时太久后面没时间每道题给自己设定最大时长第一题30分钟、第二题50分钟、第三题50分钟。超时立刻跳过回头补切忌死磕再补充一个我自己踩过的坑OD机试平台上Java和C的读入模板不太一样。我当年习惯用Scanner读String然后split但有些题目输入是多行不定长的直接nextLine()可能把空行也读进去导致解析出错。后来我改成用BufferedReader按行读再手动处理空行和末尾空格问题就少了。如果你用Cgetline也要注意换行符的处理。这类细节只有真正在模拟平台练过才能体会到。另外一个很容易被忽略的问题代码风格。机试平台不会因为代码风格扣分但如果你在考试时写一大堆没有注释、变量名全靠a,b,c,d的代码一旦提交后发现某个用例不过你连调试都无从下手。我建议平时就养成“变量名见名知意”和“关键步骤写注释”的习惯关键时刻能救命。6. 备考节奏与实战心得最后再唠叨几句备考OD机试我见过两类极端的人。一类是从业多年、代码能力很强但完全不做题结果在机试上翻车因为不熟悉题型和做题节奏另一类是基础一般但每天坚持刷3到5道题坚持一个月最后高分通过。所以我一直跟朋友说OD机试与其说是智商测试不如说是“熟练度测试”——题型就那么多算法类型就那么几个你见过的套路足够多考场上自然有底气。我个人在实操中比较受益的两个习惯是一是错题本但我不抄题只记题目对应的算法类型、我的错误原因、正确的思考链路。考前半小时翻一遍错题本比临时刷十道新题管用得多。二是限时训练无论做LeetCode还是牛客题我都会给自己加一个计时器模拟考场的紧迫感。平时不限时考试必翻车这是我反复验证过的。还有一个提分技巧是“暴力解法优先保底”。考试时如果某道题一下子想不到最优解先用最笨的暴力方法写一版过掉一部分测试用例拿到基础分然后在这个版本之上再优化。这不是浪费时间而是稳定拿分的策略。机试分数是累计的多过一组用例就有多一组的分数先保命再吃鸡。关于题库目前网上的“华为OD机试真题题库”很多质量参差不齐有的题目描述甚至互相矛盾。我的建议是以类型为准不必纠结于具体题目。看到一道题你先判断它考什么算法类型然后找同类题巩固。能做到这一点不管题库怎么变你都能从容应对。最后再分享一个心态层面的心得OD机试只是整个面试流程的一个环节它的目的是筛选出具备一定算法基础和解决问题能力的人而不是要找竞赛选手。你不需要把所有难题都AC很多通过的人也只是做对了一道半、第二道过部分用例、第三道暴力拿了分。所以放宽心按类型刷题把基础题稳稳吃透你已经比大多数裸考的人强很多了。