Compare two version numbers version1 and version2.
If version1 > version2
return 1;
if version1 < version2
return -1;
otherwise return 0
.
You may assume that the version strings are non-empty and contain only digits and the .
character.
The .
character does not represent a decimal point and is used to separate number sequences.
For instance, 2.5
is not "two and a half" or "half way to version three", it is the fifth second-level revision of the second first-level revision.
You may assume the default revision number for each level of a version number to be 0
. For example, version number 3.4
has a revision number of 3
and 4
for its first and second level revision number. Its third and fourth level revision number are both 0
.
Example 1:
Input:version1
= "0.1",version2
= "1.1" Output: -1
Example 2:
Input:version1
= "1.0.1",version2
= "1" Output: 1
Example 3:
Input:version1
= "7.5.2.4",version2
= "7.5.3" Output: -1
Example 4:
Input:version1
= "1.01",version2
= "1.001" Output: 0 Explanation: Ignoring leading zeroes, both “01” and “001" represent the same number “1”
Example 5:
Input:version1
= "1.0",version2
= "1.0.0" Output: 0 Explanation: The first version number does not have a third level revision number, which means its third level revision number is default to "0"
Note:
- Version strings are composed of numeric strings separated by dots
.
and this numeric strings may have leading zeroes. - Version strings do not start or end with dots, and they will not be two consecutive dots.
思路:
两种方法:1 将字符串转换为一个一个的vector然后比较vector;2 在比较字符串的过程中逐渐生成整数。注意方法1假设了我们的版本号只有4节的情况下。
方法1
int compareVersion(string version1, string version2) {
vector<int> v1, v2;
v1 = convert(version1);
v2 = convert(version2);
for (decltype(v1.size()) i = 0; i < v1.size() && i<v2.size(); i++) {
if (v1[i] > v2[i]) return 1;
else if (v1[i] < v2[i]) return -1;
else continue;
}
return 0;
}
vector<int> convert(string str) {
string tmp;
vector<int> res;
for (auto i : str) {
if (i == '.') {
int i = atoi(tmp.c_str());
res.push_back(i);
tmp = "";
}
else {
tmp += i;
}
}
res.push_back(atoi(tmp.c_str()));
while (res.size() < 4) res.push_back(0);
return res;
}
方法2
int compareVersion2(string version1, string version2) {
decltype(version1.size()) i, j, m, n;
i = 0, j = 0, m = version1.size(), n = version2.size();
while (i < m || j < n) {
int num1 = 0, num2 = 0;
while (i < m && version1[i] != '.') {
num1 += num1 * 10 + (version1[i] - '0');
i++;
}
while (j < n && version2[j] != '.') {
num2 = num2 * 10 + (version2[j] - '0');
j++;
}
i++, j++;
if (num1 > num2) return 1;
if (num1 < num2) return -1;
}
return 0;
}