Nameless Site

But one day, you will stand before its decrepit gate,without really knowing why.

0%

比较版本号

来源Leetcode第165题比较版本号

比较两个版本号 version1version2
如果 *version1* > *version2* 返回 1,如果 *version1* < *version2* 返回 -1, 除此之外返回 0

你可以假设版本字符串非空,并且只包含数字和 . 字符。

. 字符不代表小数点,而是用于分隔数字序列。

例如,2.5 不是“两个半”,也不是“差一半到三”,而是第二版中的第五个小版本。

你可以假设版本号的每一级的默认修订版号为 0。例如,版本号 3.4 的第一级(大版本)和第二级(小版本)修订号分别为 34。其第三级和第四级修订号均为 0

利用split分割

利用split对字符串进行切割,然后转成Int比较。对于已经遍历完的部分直接赋值为0即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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";
v1 = Integer.parseInt(num1);
v2 = Integer.parseInt(num2);
if (v1 > v2)
return 1;
else if(v1 < v2)
return -1;
else
{
p1++;
p2++;
}
}
return 0;
}

分割后字符串比较

利用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;
    }