2024华为OD试题及答案-A019-获取最大软件版本号

题目描述

Maven 版本号定义,<主版本>.<次版本>.<增量版本>-<里程碑版本>,举例3.1.4-beta

其中,主版本和次版本都是必须的,主版本,次版本,增量版本由多位数字组成,可能包含前导零,里程碑版本由字符串组成。
<主版本>.<次版本>.<增量版本>:基于数字比较;

里程碑版本:基于字符串比较,采用字典序;

比较版本号时,按从左到右的顺序依次比较。

基于数字比较, 只需比较忽略任何前导零后的整数值 。
输入2个版本号,输出最大版本号

输入描述

输入2个版本号,换行分割,每个版本的最大长度小于50

输出描述

版本号相同时输出第一个输入版本号

用例
输入2.5.1-C
1.4.2-D
输出2.5.1-C
说明
输入

1.05.1
1.5.01

输出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

  • 主版本和次版本是必需的,增量版本由多位数字组成,可能包含前导零。
  • 里程碑版本由字符串组成。

比较规则

  1. 基于数字比较,忽略前导零。
  2. 里程碑版本基于字符串比较,采用字典序。

比较版本号时,按从左到右的顺序依次比较各部分:

  • 先比较主版本号,再次版本号,然后增量版本号,最后里程碑版本号。
  • 若数字部分相同,比较里程碑版本号。

输入

输入2个版本号,每行一个,输入长度不超过50。

输出

输出两个版本号中较大的版本号。如果版本号相同,输出第一个版本号。

示例

输入:

2.5.1-C
1.4.2-D

输出:

2.5.1-C

解题思路

  1. 将版本号按照.-分割成不同部分。
  2. 先比较主版本号、次版本号和增量版本号,比较时忽略前导零。
  3. 若数字部分相同,比较里程碑版本号,采用字典序比较。
  4. 输出较大的版本号,如果版本号相同,输出第一个版本号。

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;
}

代码说明

  1. split函数:将输入字符串按指定分隔符分割成多个部分。
  2. removeLeadingZeros函数:去除数字部分的前导零。
  3. compareVersions函数:先比较主版本号、次版本号和增量版本号,如果相同则比较里程碑版本号。
  4. 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))

代码说明

  1. split函数:用于将版本号字符串按.-分割。
  2. remove_leading_zeros函数:移除字符串前导零。
  3. compare_versions函数:比较版本号的数字部分。
  4. compare_milestones函数:比较里程碑版本(字符串部分)。
  5. get_max_version函数:根据上述规则比较两个版本号,并返回较大的版本号。

这个Python程序可以比较两个版本号,基于数字部分和里程碑版本的规则,输出较大的版本号。你可以在Python环境中运行这个程序来解决题目中的问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值