题解:版本号比较
题目描述
在某个项目中,每个版本都用版本号标记,由一个或多个修订号组成,修订号之间由点号 . 分隔。每个修订号可能有多位数字,并且可能会包含前导零。你需要根据两个版本号 version1 和 version2,判断哪个版本更新,或者它们是否相同。
规则说明:
-
从左到右依次比较版本号的修订号。
-
忽略修订号的前导零,直接比较对应整数值。
-
如果版本号缺失修订号,视为 0 进行补全。
-
返回结果:
- 如果
version1 > version2,返回1。 - 如果
version1 < version2,返回-1。 - 如果两个版本相等,返回
0。
- 如果
示例
输入
version1 = "0.1"
version2 = "1.1"
输出
-1
更多示例
| 输入 | 输出 | 说明 |
|---|---|---|
version1 = "1.0.1" version2 = "1" | 1 | 1.0.1 比 1.0.0 更新 |
version1 = "7.5.2.4" version2 = "7.5.3" | -1 | 7.5.3 比 7.5.2.4 更新 |
version1 = "1.0" version2 = "1.0.0" | 0 | 两个版本号相等 |
解题思路
-
将版本号字符串按
.分割为整数数组,忽略前导零。 -
对两个数组逐一比较对应位置的修订号。
- 若某一位置修订号不同,直接返回结果。
- 若数组长度不同,超出部分的修订号默认为
0。
-
若所有修订号都相等,返回
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;
}
代码说明
-
辅助函数
splitVersion- 使用
stringstream将版本号按.分割。 - 将每个部分转为整数,存入数组。
- 使用
-
主函数
solution- 分别将两个版本号转换为整数数组。
- 对两数组逐一比较,若修订号不同,返回比较结果。
- 若数组长度不同,缺失部分视为
0。
-
时间复杂度
- 分割版本号时间复杂度为
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 |
总结
- 本题主要考察字符串处理与数组操作的能力。
- 注意处理前导零、缺失修订号等细节问题。
- 使用辅助函数提高代码的可读性和复用性。