
简介这是一套面向华为OD机试备考者的Python解题代码合集适合正在准备在线编程笔试、希望提升算法实战能力的开发者。内容覆盖IP地址识别、01背包动态规划、扑克牌大小比较、素数伴侣、数字转英语、索引统计等典型题型涉及socket与ipaddress模块、collections容器、字符串格式化、自定义排序及质数筛法等知识点可作为刷题时的参考实现与思路对照。资源包共106个文件以103个py脚本为主另含3个txt说明文件整体约59KB体积轻便便于本地运行调试与逐题研读。目前已有1592人学习下载读者可借此熟悉常见算法套路、理解不同数据结构的运用方式并积累Python编码技巧与排错经验为机试及同类面试做好针对性准备。1. 华为OD机试Python语言从评分规则倒推这场机试到底考什么很多人准备华为OD机试第一反应是去刷LeetCode刷了几百道一上机还是挂。问题不在题量在于没搞清楚这场机试的评分逻辑。华为OD机试通常三道编程题分值常见为100、200、300按通过用例比例给分不是全对才得分。这意味着你的目标不是“把题做完”而是“把能拿的分拿满”。Python在这类机试里有天然优势字符串处理快、列表字典灵活、标准库够用但劣势也明显——递归深度受限、大数运算虽然方便但容易忽略复杂度。这场考试适合两类人一是转行或应届想进OD的开发者二是有一定基础但没系统练过机试题的求职者。核心就一句话先保简单题满分再啃中等题难题拿部分分。下面按考点分布、高频题型、易错点、答题节奏四块拆开讲每一块都落到你能直接背、直接练的程度。2. 考点分布三道题的分值结构和高频题型清单2.1 100分题字符串与模拟必须拿满100分题通常是最简单的一道考字符串处理、数组遍历、简单模拟。这类题在华为OD机试里出现频率极高因为能快速筛掉基础不扎实的人。常见考法包括字符串反转、子串查找、字符统计、简单加密解密、日期计算、进制转换。Python做这类题有天然优势str的split、join、replace、stripcollections.Counterre模块都是高频工具。一道典型真题给一个字符串统计每个字符出现的次数按次数降序输出次数相同按字符升序。这题考的就是Counter加排序。答题思路先用Counter统计再用sorted配合 lambda 排序注意排序键是(-count, char)。代码大概长这样from collections import Counter def char_freq(s): # 统计字符频率 cnt Counter(s) # 按次数降序、字符升序排序 items sorted(cnt.items(), keylambda x: (-x[1], x[0])) return items参数说明s是输入字符串cnt.items()返回字符和次数的元组排序键-x[1]表示次数降序x[0]表示字符升序。这类题丢分通常不是不会而是没看清输出格式——比如要求用空格分隔还是逗号分隔要不要换行大小写是否敏感。机试的判题是严格字符串比对格式错一个字符就是0分。2.2 200分题数据结构与算法拿部分分是底线200分题通常考数组、链表、栈、队列、哈希表、简单动态规划、二分查找、双指针。这类题的特点是暴力解法能过一部分用例优化解法才能全过。但机试按用例给分所以策略是先用暴力拿基础分再想优化。高频题型包括两数之和变种、最长子串、区间合并、螺旋矩阵、二叉树遍历、简单背包。以“最长无重复子串”为例暴力是两层循环O(n²)能过小规模用例滑动窗口是O(n)能过全部。答题时先写暴力确认逻辑对再改滑动窗口。代码def longest_unique_substring(s): # 滑动窗口 left 0 seen {} max_len 0 for right, ch in enumerate(s): if ch in seen and seen[ch] left: left seen[ch] 1 seen[ch] right max_len max(max_len, right - left 1) return max_len参数说明left是窗口左边界seen记录字符最后出现的位置right是右边界。关键点是seen[ch] left这个判断防止左边界回退。这类题在华为OD机试里出现频率很高因为能区分“会写代码”和“会写高效代码”。2.3 300分题复杂模拟与图论能拿多少拿多少300分题通常考图论、复杂动态规划、拓扑排序、并查集、最短路径。这类题对Python来说有挑战因为递归深度限制和性能问题。但策略是先看能不能用BFS/DFS暴力过部分用例再考虑优化。如果实在没思路至少把输入输出框架写好拿格式分。常见考法岛屿数量、课程表、最短路径、背包变种。以“岛屿数量”为例DFS和BFS都能做但Python递归深度默认1000大矩阵会爆栈所以用BFS或手动栈更稳。代码from collections import deque def num_islands(grid): if not grid: return 0 rows, cols len(grid), len(grid[0]) count 0 for i in range(rows): for j in range(cols): if grid[i][j] 1: count 1 # BFS 标记整个岛屿 q deque([(i, j)]) grid[i][j] 0 while q: r, c q.popleft() for dr, dc in [(1,0),(-1,0),(0,1),(0,-1)]: nr, nc rdr, cdc if 0 nr rows and 0 nc cols and grid[nr][nc] 1: grid[nr][nc] 0 q.append((nr, nc)) return count参数说明grid是二维字符矩阵deque是双端队列popleft是O(1)出队。关键点是入队时立即标记避免重复入队。这类题在机试里属于“区分度题”能全过的人不多但拿一半用例分是可行的。3. 高频真题演练五道典型题的答题思路与代码3.1 字符串压缩与解压题目给一个字符串如aaabbc压缩成a3b2c1再给一个压缩串解压回原串。这题考字符串遍历和边界处理。答题思路压缩时用双指针或计数解压时解析数字和字符。注意数字可能是多位数比如a12表示12个a。def compress(s): if not s: return res [] count 1 for i in range(1, len(s)): if s[i] s[i-1]: count 1 else: res.append(s[i-1] str(count)) count 1 res.append(s[-1] str(count)) return .join(res) def decompress(s): res [] i 0 while i len(s): ch s[i] i 1 num 0 while i len(s) and s[i].isdigit(): num num * 10 int(s[i]) i 1 res.append(ch * num) return .join(res)参数说明compress里count初始为1循环从第二个字符开始decompress里num累加多位数。易错点是最后一个字符的处理压缩时循环结束后要补上最后一组。3.2 两数之和变种找所有不重复对题目给一个数组和目标值找出所有和为目标值的不重复对。这题考哈希表和去重。答题思路先排序再用双指针跳过重复元素。或者用哈希表记录已访问但去重麻烦。双指针更稳。def two_sum_pairs(nums, target): nums.sort() res [] left, right 0, len(nums) - 1 while left right: s nums[left] nums[right] if s target: res.append((nums[left], nums[right])) # 跳过重复 while left right and nums[left] nums[left1]: left 1 while left right and nums[right] nums[right-1]: right - 1 left 1 right - 1 elif s target: left 1 else: right - 1 return res参数说明nums是输入数组target是目标和。关键点是排序后双指针以及跳过重复元素的逻辑。这类题在华为OD机试里常考因为能同时考排序、双指针、去重。3.3 区间合并题目给一组区间合并重叠部分。如[[1,3],[2,6],[8,10]]合并成[[1,6],[8,10]]。答题思路按左端点排序然后遍历合并。def merge_intervals(intervals): if not intervals: return [] intervals.sort(keylambda x: x[0]) res [intervals[0]] for start, end in intervals[1:]: if start res[-1][1]: res[-1][1] max(res[-1][1], end) else: res.append([start, end]) return res参数说明intervals是二维列表res[-1][1]是当前合并区间的右端点。关键点是排序和比较start res[-1][1]。易错点是没排序直接合并或者合并时没取max。3.4 二叉树层序遍历题目给一棵二叉树按层输出节点值。答题思路BFS用队列记录每层节点数。from collections import deque def level_order(root): if not root: return [] res [] q deque([root]) while q: level [] for _ in range(len(q)): node q.popleft() level.append(node.val) if node.left: q.append(node.left) if node.right: q.append(node.right) res.append(level) return res参数说明root是树根q是队列len(q)是当前层节点数。关键点是for _ in range(len(q))控制每层。这类题在机试里属于中等难度必须拿满。3.5 简单动态规划爬楼梯变种题目一次可以爬1阶或2阶但某些台阶不能踩问有多少种走法。答题思路dp[i] dp[i-1] dp[i-2]如果i不能踩则dp[i] 0。def climb_stairs(n, bad): dp [0] * (n 1) dp[0] 1 for i in range(1, n 1): if i in bad: dp[i] 0 else: dp[i] dp[i-1] (dp[i-2] if i 2 else 0) return dp[n]参数说明n是总台阶数bad是不能踩的台阶集合。关键点是dp[0] 1作为起点以及i in bad时置0。易错点是边界条件比如n0或n1。4. 易错点五条血泪经验每条都有人翻车4.1 输入输出格式错全盘皆输错在哪很多人题做对了但输出格式不对比如该用空格分隔用了逗号该换行没换行该输出列表输出了元组。为什么错机试判题是严格字符串比对不是人工看。怎么答对先在本地用print模拟输出确认和题目示例完全一致。注意题目里的“输出描述”每一个字都要读。4.2 递归深度爆栈Python特有坑错在哪用递归做DFS矩阵稍微大一点就RecursionError。为什么错Python默认递归深度1000机试环境可能更低。怎么答对能用BFS就用BFS或者手动用栈模拟递归或者sys.setrecursionlimit(10000)但后者不一定稳。4.3 时间复杂度没算暴力过不了大用例错在哪两层循环O(n²)在小用例能过大用例超时。为什么错机试按用例给分大用例占分高。怎么答对先估算数据规模n10⁵以上必须O(n)或O(n log n)。用哈希表、双指针、二分查找优化。4.4 边界条件漏判空数组和单元素错在哪输入为空、只有一个元素、全相同元素时程序崩溃或结果错。为什么错没写边界判断。怎么答对每个函数开头先判空循环边界用len-1时注意越界。这类题通常有专门的小用例测边界。4.5 变量名拼写错调试半小时错在哪left写成lfetcount写成cout运行时NameError。为什么错机试没有IDE自动补全手写容易错。怎么答对变量名用短而清晰的写完快速扫一遍。这类错误最冤但最常见。5. 答题节奏与押题思路三小时怎么分配机试通常给2到3小时三道题。我的建议是前30分钟只做100分题确保满分中间60分钟做200分题先暴力再优化最后60分钟啃300分题能拿多少拿多少留30分钟检查输入输出格式和边界用例。这个节奏是我自己踩坑后总结的——有一次先啃难题结果简单题没时间检查格式错了一个空格直接丢100分。从那以后我每次机试都强制走一遍“先易后难、先格式后优化”的流程。押题方向上字符串处理和数组操作是必考因为能快速筛人动态规划和图论是拉分项但不用死磕拿部分分就行。Python选手要特别注意多用标准库collections、itertools、heapq、bisect都是利器少用递归多用迭代输入用sys.stdin.read().split()比input()快。最后说一个具体方法建一个自己的模板库把字符串、数组、BFS、DFS、二分、DP的常用写法各存一份考前背熟。机试时直接套省时间。希望帮到你。本文还有配套的精品资源点击获取