题目
给你两个版本号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
。
题解
思路:双指针一次遍历,分段比较。
int compareVersion(string version1, string version2) {
int i = 0, j = 0;
int sum1 = 0, sum2 = 0;
while(i < version1.length() || j < version2.length()){
if(i < version1.length() && version1[i] != '.'){
sum1 = sum1 * 10 + (version1[i] - '0');
i++;
}
if(j < version2.length() && version2[j] != '.'){
sum2 = sum2 * 10 + (version2[j] - '0');
j++;
}
if((i >= version1.length() || version1[i] == '.' ) && (j >= version2.length() ||version2[j] == '.')){ //两边同时遇到'.'或结束
if(sum1 < sum2)
return -1;
else if(sum1 > sum2)
return 1;
if(i >= version1.length() && j >= version2.length() && sum1 == sum2)
return 0;
sum1 = sum2 = 0;
i++;
j++;
}
}
return 0;
}
虽然速度很快,但代码很丑。实际上while
内再嵌套两个for循环会更好↓
int compareVersion(string version1, string version2) {
int i = 0, j = 0;
int sum1 = 0, sum2 = 0;
while(i < version1.length() || j < version2.length()){
sum1 = 0;
for(; i < version1.length() && version1[i] != '.'; i++){
sum1 = sum1 * 10 + version1[i] - '0';
}
i++;
sum2 = 0;
for(; j < version2.length() && version2[j] != '.'; j++){
sum2 = sum2 * 10 + version2[j] - '0';
}
j++;
if(sum2 != sum1)
return sum2 > sum1 ? -1 : 1;
}
return 0;
}