给你两个版本号 version1 和 version2 ,请你比较它们。
版本号由一个或多个修订号组成,各修订号由一个 '.' 连接。每个修订号由 多位数字 组成,可能包含 前导零 。每个版本号至少包含一个字符。修订号从左到右编号,下标从 0 开始,最左边的修订号下标为 0 ,下一个修订号下标为 1 ,以此类推。例如,2.5.33 和 0.1 都是有效的版本号。
比较版本号时,请按从左到右的顺序依次比较它们的修订号。比较修订号时,只需比较 忽略任何前导零后的整数值 。也就是说,修订号 1 和修订号 001 相等 。如果版本号没有指定某个下标处的修订号,则该修订号视为 0 。例如,版本 1.0 小于版本 1.1 ,因为它们下标为 0 的修订号相同,而下标为 1 的修订号分别为 0 和 1 ,0 < 1 。
返回规则如下:
如果 version1 > version2 返回 1,
如果 version1 < version2 返回 -1,
除此之外返回 0。
示例 1:
输入:version1 = "1.01", version2 = "1.001"
输出:0
解释:忽略前导零,"01" 和 "001" 都表示相同的整数 "1"
示例 2:
输入:version1 = "1.0", version2 = "1.0.0"
输出:0
解释:version1 没有指定下标为 2 的修订号,即视为 "0"
示例 3:
输入:version1 = "0.1", version2 = "1.1"
输出:-1
解释:version1 中下标为 0 的修订号是 "0",version2 中下标为 0 的修订号是 "1" 。0 < 1,所以 version1 < version2
示例 4:
输入:version1 = "1.0.1", version2 = "1"
输出:1
示例 5:
输入:version1 = "7.5.2.4", version2 = "7.5.3"
输出:-1
提示:
1 <= version1.length, version2.length <= 500
version1 和 version2 仅包含数字和 '.'
version1 和 version2 都是 有效版本号
version1 和 version2 的所有修订号都可以存储在 32 位整数 中
实在是太巧了。最近,正好做的项目也遇到比较版本类似的需求。
重新写了一下,这次经过测试用例。我觉得这个比较函数可以使用了。
#include<iostream>
#include<string>
#include<vector>
using namespace std;
class Solution {
public:
int compareVersion(string version1, string version2) {
int ret = 0; //默认相等
vector<int> verVec1, verVec2;
size_t len1, len2, maxlen;
createVersionVec(verVec1, version1);
createVersionVec(verVec2, version2);
len1 = verVec1.size();
len2 = verVec2.size();
/* 没有一个 "."的情况,默认就用原始version做比较 */
if (len1 == 0) {
verVec1.push_back(stoi(version1));
len1++;
}
if (len2 == 0) {
verVec2.push_back(stoi(version2));
len2++;
}
/* 出现某一个数组的长度不够的情况,用0补齐 */
maxlen = max(len1, len2);
while (len1 < maxlen) {
verVec1.push_back(0);
len1++;
}
while (len2 < maxlen) {
verVec2.push_back(0);
len2++;
}
for (size_t i = 0; i < maxlen; i++) {
if (verVec1[i] > verVec2[i]) {
ret = 1;
goto L_Over;
}
else if (verVec1[i] < verVec2[i]) {
ret = -1;
goto L_Over;
}
}
L_Over:
return ret;
}
private:
size_t max(size_t a, size_t b) {
return (a >= b ? a : b);
}
/* 以"."切割字符串,并生成vector<int>数组用于对比 */
void createVersionVec(vector<int>& vec, string version) {
string::size_type lIndex = 0, rIndex = 0; //lIndex作为左边界,rIndex作为'.'的下标
string tmpVer;
for (char c : version) {
if (c == '.') {
tmpVer = version.substr(lIndex, rIndex - lIndex);
lIndex = rIndex + 1;
vec.push_back(stoi(tmpVer));
}
rIndex++;
}
if (lIndex > 0) {
tmpVer = version.substr(lIndex, rIndex - lIndex);
vec.push_back(stoi(tmpVer));
}
}
};
int main() {
Solution* ps = new Solution();
string version = "7.5.2.4.23.122.44.56";
cout << ps->compareVersion("1", "0") << endl;
system("pause");
return 0;
}