**语义化版本号对比**
2026 华为OD机试真题 8月2日华为OD上机新系统考试真题 100 分题型
点击查看华为 OD 机试真题完整目录:2026最新华为OD机试新系统卷 + 双机位C卷 真题题库目录|全覆盖题库 + 逐点算法考点详解
题目描述
当前有一组版本号列表信息,单个版本号格式为:Major.Minor.Patch-可选先行版+可选构建信息,具体字段如下:
Major.Minor.Patch:为三个非负整数,禁止前导零;- 先行版和构建信息:可选段信息,由字母数字和符号(
.和-)组成;
请实现语义化版本号比较器,对输入版本号字符串列表按下面规则处理,返回最大的版本号(若存在相等最大版本号,则返回第一个版本号),若存在不合规格式则返回空字符串。
优先级比较:从左至右比较 Major Minor Patch 数字大小,大的优先;若 Major Minor Patch 相同,则继续对比先行版信息(第一个 - 号为分隔符,有信息大于无信息);如果先行版信息相同,则对比构建信息(第一个 + 号为分隔符,有信息大于无信息);
先行版和构建信息如果包含符号 .,先按 . 切分然后逐一对比,切分后首个元素大的优先,如果首元素相同则比较第二个,依次类推;单个元素对比规则如下:
- 纯数值:按数值大的优先
- 字符/数字/符号/混合串:ASCII 字典序大的优先 (
1<A<a) - 前缀相同:内容多者优先 (
a-b < a-b-c)
2026 华为OD机试真题 8月2日华为OD上机新系统考试真题 100 分题型
点击查看华为 OD 机试真题完整目录:2026最新华为OD机试新系统卷 + 双机位C卷 真题题库目录|全覆盖题库 + 逐点算法考点详解
输入描述
输入版本号列表长度在 [1,100] 之间,每个版本号字符串长度在 [0,1024] 之间,其中纯数字标识符的值在 [0,2^{31}-1] 之间,非纯数字标识符长度在 [0,1024] 之间。
先行版和构建信息输入保证:任意符号之间内容不为空,信息中可能出现 - 或 .,不出现 _、.(在特定上下文中)、~,不以符号开头或结尾,纯数字标识符无前导零;+ 最多出现一次;
输入为一行,多个版本号之间使用英文逗号分隔。
输出描述
返回最大的版本号字符串,若存在不合规格式则返回空字符串。
示例1
输入
0.0.1,0.1.1,1.0.0
输出
1.0.0
说明
按顺序对比Major.Minor.Patch大小,
1>0>0
示例2
输入
1.0.0-alpha,1.0.0.alpha.alpha,1.0.0-alpha.beta
输出
1.0.0-alpha.beta
说明
先行版按照分隔符顺序对比每一部分的ASCII值,
b>a
示例3
输入
1.0.0_alpha,1.0.0.alpha,1.0.0~alpha
输出
说明
'_'、'.'、'~'都属于非法内容
示例4
输入
1.0.0-alpha+2025,1.0.0-alpha+2026
输出
1.0.0-alpha+2026
说明
2026>2025
解题思路
核心思想
先把每个版本号解析成 主版本三元组 + 先行版 + 构建信息。只要任意版本号不合法,直接输出空字符串;否则从左到右维护当前最大版本号,相等时不更新,从而自然保留第一个最大版本。
算法步骤
- 按英文逗号切分输入行,得到版本号列表。
- 对每个版本号做合法性校验:主版本必须是 3 个无前导零的非负整数,数值不超过
2^31-1;+最多一个;先行版和构建信息只能包含字母、数字、.、-,且.分隔后的段不能为空。 - 解析出主版本、先行版、构建信息。
- 比较两个版本时,先比较主版本三个数字,再比较先行版,最后比较构建信息。
- 先行版和构建信息按
.切分,逐段比较:两段都是纯数字则按整数比较,否则按 ASCII 字典序比较;前面都相同则段数更多者更大。
复杂度分析
设版本号个数为 n,单个版本号最大长度为 L。
- 时间复杂度:
O(nL),每个版本号解析和比较都只线性扫描字符串。 - 空间复杂度:
O(L),用于保存拆分后的先行版或构建信