版本号比较 | 豆包MarsCode AI刷题

118 阅读2分钟

题解:版本号比较

题目描述

在某个项目中,每个版本都用版本号标记,由一个或多个修订号组成,修订号之间由点号 . 分隔。每个修订号可能有多位数字,并且可能会包含前导零。你需要根据两个版本号 version1version2,判断哪个版本更新,或者它们是否相同。

规则说明:

  1. 从左到右依次比较版本号的修订号。

  2. 忽略修订号的前导零,直接比较对应整数值。

  3. 如果版本号缺失修订号,视为 0 进行补全。

  4. 返回结果:

    • 如果 version1 > version2,返回 1
    • 如果 version1 < version2,返回 -1
    • 如果两个版本相等,返回 0

示例

输入

version1 = "0.1"
version2 = "1.1"

输出

-1

更多示例

输入输出说明
version1 = "1.0.1" version2 = "1"11.0.11.0.0 更新
version1 = "7.5.2.4" version2 = "7.5.3"-17.5.37.5.2.4 更新
version1 = "1.0" version2 = "1.0.0"0两个版本号相等

解题思路

  1. 将版本号字符串按 . 分割为整数数组,忽略前导零。

  2. 对两个数组逐一比较对应位置的修订号。

    • 若某一位置修订号不同,直接返回结果。
    • 若数组长度不同,超出部分的修订号默认为 0
  3. 若所有修订号都相等,返回 0


代码实现

#include "iostream"
#include <string>
#include <vector>
#include <sstream>

using namespace std;

// 辅助函数:将版本号按 '.' 分割为整数数组
vector<int> splitVersion(const string& version) {
    vector<int> result;
    stringstream ss(version);
    string segment;
    while (getline(ss, segment, '.')) {
        result.push_back(stoi(segment)); // 忽略前导零
    }
    return result;
}

// 主函数:比较两个版本号
int solution(string version1, string version2) {
    vector<int> v1 = splitVersion(version1);
    vector<int> v2 = splitVersion(version2);

    size_t n = max(v1.size(), v2.size());
    for (size_t i = 0; i < n; ++i) {
        int num1 = i < v1.size() ? v1[i] : 0;
        int num2 = i < v2.size() ? v2[i] : 0;
        if (num1 > num2) return 1;
        if (num1 < num2) return -1;
    }
    return 0;
}

int main() {
    cout << solution("0.1", "1.1") << endl;       // 输出: -1
    cout << solution("1.0.1", "1") << endl;      // 输出: 1
    cout << solution("7.5.2.4", "7.5.3") << endl; // 输出: -1
    cout << solution("1.0", "1.0.0") << endl;    // 输出: 0
    return 0;
}

代码说明

  1. 辅助函数 splitVersion

    • 使用 stringstream 将版本号按 . 分割。
    • 将每个部分转为整数,存入数组。
  2. 主函数 solution

    • 分别将两个版本号转换为整数数组。
    • 对两数组逐一比较,若修订号不同,返回比较结果。
    • 若数组长度不同,缺失部分视为 0
  3. 时间复杂度

    • 分割版本号时间复杂度为 O(L),其中 L 是版本号字符串的总长度。
    • 比较修订号时间复杂度为 O(M),其中 M 是修订号的最大个数。
    • 总体时间复杂度为 O(L + M)

测试用例

测试用例预期输出
"0.1", "1.1"-1
"1.0.1", "1"1
"7.5.2.4", "7.5.3"-1
"1.0", "1.0.0"0
"2.01", "2.001"0
"1.2.3.4.5", "1.2.3.4"1

总结

  • 本题主要考察字符串处理与数组操作的能力。
  • 注意处理前导零、缺失修订号等细节问题。
  • 使用辅助函数提高代码的可读性和复用性。