**语义化版本号对比**

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

解题思路

核心思想

先把每个版本号解析成 主版本三元组 + 先行版 + 构建信息。只要任意版本号不合法,直接输出空字符串;否则从左到右维护当前最大版本号,相等时不更新,从而自然保留第一个最大版本。

算法步骤

  1. 按英文逗号切分输入行,得到版本号列表。
  2. 对每个版本号做合法性校验:主版本必须是 3 个无前导零的非负整数,数值不超过 2^31-1+ 最多一个;先行版和构建信息只能包含字母、数字、.-,且 . 分隔后的段不能为空。
  3. 解析出主版本、先行版、构建信息。
  4. 比较两个版本时,先比较主版本三个数字,再比较先行版,最后比较构建信息。
  5. 先行版和构建信息按 . 切分,逐段比较:两段都是纯数字则按整数比较,否则按 ASCII 字典序比较;前面都相同则段数更多者更大。

复杂度分析

设版本号个数为 n,单个版本号最大长度为 L

  • 时间复杂度:O(nL),每个版本号解析和比较都只线性扫描字符串。
  • 空间复杂度:O(L),用于保存拆分后的先行版或构建信
THE END