来源Leetcode第165题比较版本号
比较两个版本号 version1 和 version2。
如果 *version1* > *version2*
返回 1
,如果 *version1* < *version2*
返回 -1
, 除此之外返回 0
。
你可以假设版本字符串非空,并且只包含数字和 .
字符。
.
字符不代表小数点,而是用于分隔数字序列。
例如,2.5
不是“两个半”,也不是“差一半到三”,而是第二版中的第五个小版本。
你可以假设版本号的每一级的默认修订版号为 0
。例如,版本号 3.4
的第一级(大版本)和第二级(小版本)修订号分别为 3
和 4
。其第三级和第四级修订号均为 0
。
利用split分割
利用split对字符串进行切割,然后转成Int比较。对于已经遍历完的部分直接赋值为0即可。
1 | public int compareVersion(String version1, String version2) { |
分割后字符串比较
利用Integer.parseInt在一定程度上增加了运行时间并且当数字过大时,可能会溢出,无法比较,因而可以进一步直接用字符串比较。
然而提交后还是一样的用时,我傻了。
public int compareVersion(String version1, String version2) {
String [] temp1 = version1.split("\\.");
String [] temp2 = version2.split("\\.");
int p1 = 0 , p2 = 0;
int v1,v2;
while(p1 < temp1.length || p2 < temp2.length){
String num1 = p1 < temp1.length ? temp1[p1] : "0";
String num2 = p2 < temp2.length ? temp2[p2] : "0";
//去掉前导0
v1 = 0;
v2 = 0;
for(int i = 0 ; i < num1.length(); i++){
if(num1.charAt(i) == '0')
v1++;
else
break;
}
for(int i = 0 ; i < num2.length(); i++){
if(num2.charAt(i) == '0')
v2++;
else
break;
}
num1 = num1.substring(v1);
num2 = num2.substring(v2);
//开始比较字符串
if(num1.length() > num2.length())
return 1;
else if(num2.length() > num1.length())
return -1;
else
{
for(int i = 0 ; i < num1.length() ; i++){
if (num1.charAt(i) - num2.charAt(i) > 0) {
return 1;
} else if (num1.charAt(i) - num2.charAt(i) < 0) {
return -1;
}
}
p1++;
p2++;
}
}
return 0;
}