问题描述:
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.
源码:
这题麻烦的就是考虑的因素太多了。试了很多次才过关。
我的主体思想是,每次取出两个圆点之间的子串比较,子串的大小可以作为全局的大小;
如果一直相同:最后如果哪个串有多余的元素,并且该多余元素不是仅仅由0和点组成,就是多出来的大。
如果到最后,全相等,或者长串多出来的只有'.'开头的0和'.',那么返回0.
写的很搓,因为今天有点事,后面我会继续学习大佬的做法给大家展示,今天就先写我自己写的cuo方法:
时间100%,空间100%
class Solution {
public:
int compare(string num1, string num2){
int i=0, j=0, len1=num1.length(), len2 = num2.length();
while(num1[i] == '0') i++;
while(num2[j] == '0') j++;
if (len1-i > len2-j) return 1;
else if (len1-i < len2-j) return -1;
while(i<len1 && j<len2){
if (num1[i] > num2[j]) return 1;
else if (num1[i] < num2[j]) return -1;
i++; j++;
}
return 0;
}
int compareVersion(string version1, string version2) {
int len1 = version1.length(), len2 = version2.length();
int i=0, j=0;
while(version1[i] == '0') i++;
while(version2[j] == '0') j++;
while (i<len1 && j<len2){
int tmp_i=i, tmp_j=j;
while(version1[i] != '.' && i<len1) i++;
while(version2[j] != '.' && j<len2) j++;
int flag = compare(version1.substr(tmp_i, i-tmp_i), version2.substr(tmp_j, j-tmp_j));
if(flag == 1) return 1;
else if(flag == -1) return -1;
if(i==len1 || j==len2) break;
i++;
j++;
}
if (i<len1 && j>=len2){
if (version1[i] == '.'){
i++;
while(version1[i] == '.' || version1[i] == '0'){
if(i == len1-1) return 0;
i++;
}
}
return 1;
}
if (i>=len1 && j<len2){
if (version2[j] == '.'){
j++;
while(version2[j] == '.' || version2[j] == '0'){
if(j == len2-1) return 0;
j++;
}
}
return -1;
}
return 0;
}
};
网上大佬的解法,思路大体相同,代码简洁了很多。但是我没想到可以用int来表示各个字串,其实这样是不合理的,万一输入用例的子串大的int存不下呢?所以我想这是leetcode输入测试不完善。
时间空间同样是100%。
class Solution {
public:
int compareVersion(string version1, string version2) {
int len1 = version1.length(), len2 = version2.length();
int i=0, j=0;
while (i<len1 || j<len2){
int num1=0, num2=0;
while(version1[i] != '.' && i<len1){
num1 = num1*10 + (version1[i++]-'0');
}
while(version2[j] != '.' && j<len2){
num2 = num2*10 + (version2[j++]-'0');
}
if(i<len1) i++;
if(j<len2) j++;
if (num1 == num2) continue;
else if (num1 > num2) return 1;
else if (num1 < num2) return -1;
}
return 0;
}
};