题目描述
Maven 版本号定义,<主版本>.<次版本>.<增量版本>-<里程碑版本>,举例3.1.4-beta
其中,主版本和次版本都是必须的,主版本,次版本,增量版本由多位数字组成,可能包含前导零,里程碑版本由字符串组成。
<主版本>.<次版本>.<增量版本>:基于数字比较;
里程碑版本:基于字符串比较,采用字典序;
比较版本号时,按从左到右的顺序依次比较。
基于数字比较, 只需比较忽略任何前导零后的整数值 。
输入2个版本号,输出最大版本号。
输入描述
输入2个版本号,换行分割,每个版本的最大长度小于50
输出描述
版本号相同时输出第一个输入版本号
用例
输入 | 2.5.1-C 1.4.2-D |
输出 | 2.5.1-C |
说明 | 无 |
输入 | 1.05.1 |
输出 | 1.05.1 |
说明 | 版本号相同,输出第一个版本号 |
输入 | 1.5 1.5.0 |
输出 | 1.5.0 |
说明 | 主次相同,存在增量版本大于不存在 |
输入 | 1.5.1-A 1.5.1-a |
输出 | 1.5.1-a |
说明 | 里程碑版本号,基于字典序比较,a 大于 A |
题目解析
版本号定义
Maven版本号定义为:<主版本>.<次版本>.<增量版本>-<里程碑版本>,例如 3.1.4-beta
。
- 主版本和次版本是必需的,增量版本由多位数字组成,可能包含前导零。
- 里程碑版本由字符串组成。
比较规则
- 基于数字比较,忽略前导零。
- 里程碑版本基于字符串比较,采用字典序。
比较版本号时,按从左到右的顺序依次比较各部分:
- 先比较主版本号,再次版本号,然后增量版本号,最后里程碑版本号。
- 若数字部分相同,比较里程碑版本号。
输入
输入2个版本号,每行一个,输入长度不超过50。
输出
输出两个版本号中较大的版本号。如果版本号相同,输出第一个版本号。
示例
输入:
2.5.1-C
1.4.2-D
输出:
2.5.1-C
解题思路
- 将版本号按照
.
和-
分割成不同部分。 - 先比较主版本号、次版本号和增量版本号,比较时忽略前导零。
- 若数字部分相同,比较里程碑版本号,采用字典序比较。
- 输出较大的版本号,如果版本号相同,输出第一个版本号。
C++代码实现
#include <iostream>
#include <string>
#include <vector>
#include <sstream>
using namespace std;
// 分割字符串函数
vector<string> split(const string &s, char delimiter) {
vector<string> tokens;
string token;
istringstream tokenStream(s);
while (getline(tokenStream, token, delimiter)) {
tokens.push_back(token);
}
return tokens;
}
// 去除前导零函数
string removeLeadingZeros(const string &s) {
size_t start = s.find_first_not_of('0');
if (start == string::npos) {
return "0";
}
return s.substr(start);
}
// 比较版本号函数
int compareVersions(const string &v1, const string &v2) {
vector<string> parts1 = split(v1, '.');
vector<string> parts2 = split(v2, '.');
// 比较主版本号、次版本号和增量版本号
for (size_t i = 0; i < 3; ++i) {
int num1 = stoi(removeLeadingZeros(parts1[i]));
int num2 = stoi(removeLeadingZeros(parts2[i]));
if (num1 != num2) {
return num1 > num2 ? 1 : -1;
}
}
// 处理里程碑版本
string milestone1 = parts1.size() > 3 ? parts1[3] : "";
string milestone2 = parts2.size() > 3 ? parts2[3] : "";
return milestone1.compare(milestone2);
}
int main() {
string version1, version2;
cin >> version1 >> version2;
int result = compareVersions(version1, version2);
if (result == 0 || result > 0) {
cout << version1 << endl;
} else {
cout << version2 << endl;
}
return 0;
}
代码说明
- split函数:将输入字符串按指定分隔符分割成多个部分。
- removeLeadingZeros函数:去除数字部分的前导零。
- compareVersions函数:先比较主版本号、次版本号和增量版本号,如果相同则比较里程碑版本号。
- main函数:读取两个版本号并调用比较函数,输出较大的版本号。如果版本号相同,输出第一个版本号。
这个程序将读取两个版本号,比较它们并输出较大的版本号。如果两个版本号相同,输出第一个版本号。
python代码实现
def split(s, delimiter):
return s.split(delimiter)
def remove_leading_zeros(s):
return str(int(s)) if s.isdigit() else s
def compare_versions(version1, version2):
parts1 = split(version1, '.')
parts2 = split(version2, '.')
for i in range(max(len(parts1), len(parts2))):
part1 = remove_leading_zeros(parts1[i]) if i < len(parts1) else '0'
part2 = remove_leading_zeros(parts2[i]) if i < len(parts2) else '0'
if part1 != part2:
return 1 if part1 > part2 else -1
return 0
def compare_milestones(milestone1, milestone2):
if not milestone1 and milestone2:
return -1
if milestone1 and not milestone2:
return 1
if milestone1 == milestone2:
return 0
return 1 if milestone1 > milestone2 else -1
def get_max_version(version1, version2):
main_parts1 = split(version1, '-')
main_parts2 = split(version2, '-')
main_comparison = compare_versions(main_parts1[0], main_parts2[0])
if main_comparison != 0:
return version1 if main_comparison > 0 else version2
if len(main_parts1) == 1 and len(main_parts2) == 1:
return version1
if len(main_parts1) == 1:
return version1
if len(main_parts2) == 1:
return version2
milestone_comparison = compare_milestones(main_parts1[1], main_parts2[1])
return version1 if milestone_comparison >= 0 else version2
# 读取输入
version1 = input().strip()
version2 = input().strip()
# 输出结果
print(get_max_version(version1, version2))
代码说明
- split函数:用于将版本号字符串按
.
或-
分割。 - remove_leading_zeros函数:移除字符串前导零。
- compare_versions函数:比较版本号的数字部分。
- compare_milestones函数:比较里程碑版本(字符串部分)。
- get_max_version函数:根据上述规则比较两个版本号,并返回较大的版本号。
这个Python程序可以比较两个版本号,基于数字部分和里程碑版本的规则,输出较大的版本号。你可以在Python环境中运行这个程序来解决题目中的问题。