bluecode-版本号比较

30 阅读1分钟

问题描述

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

例如,2.5.33 和 0.1 都是有效的版本号。

当比较两个版本时,从左到右依次比较它们的修订号。忽略每个修订号的前导零,直接比较修订号对应的整数值。如果其中一个版本没有足够的修订号,缺失部分默认补为0

你需要根据以下规则返回比较结果:

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

测试样例

样例1:

输入:version1 = "0.1" , version2 = "1.1"
输出:-1

样例2:

输入:version1 = "1.0.1" , version2 = "1"
输出:1

样例3:

输入:version1 = "7.5.2.4" , version2 = "7.5.3"
输出:-1

样例4:

输入:version1 = "1.0" , version2 = "1.0.0"
输出:0

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

using namespace std;

vector<int> splitVersion(const string &version) {
  vector<int> parts;
  stringstream ss(version);
  string part;
  while (getline(ss, part, '.')) {
    parts.push_back(stoi(part));
  }

  return parts;
}

int solution(std::string version1, std::string version2) {
  vector<int> v1 = splitVersion(version1);
  vector<int> v2 = splitVersion(version2);

  int maxLen = max(v1.size(), v2.size());

  for (int i = 0; i < maxLen; ++i) {
    int num1 = (i < v1.size()) ? v1[i] : 0;
    int num2 = (i < v2.size()) ? v2[i] : 0;

    if (num1 > num2) {
      return 1;
    } else if (num1 < num2) {
      return -1;
    }
  }

  return 0;
}

int main() {
  // Add your test cases here

  std::cout << (solution("0.1", "1.1") == -1) << std::endl;
  std::cout << (solution("1.0.1", "1") == 1) << std::endl;
  std::cout << (solution("7.5.2.4", "7.5.3") == -1) << std::endl;
  std::cout << (solution("1.0", "1.0.0") == 0) << std::endl;

  return 0;
}