165. 比较版本号

275 阅读1分钟

思路:

  • “.” 把version分割成多个chunks,两个version对应位置上的chunk进行大小比较即可。
  • 如果两个version的chunks不一样多,那么短的那个补0就行。

方法一(最优解):

class Solution {
    public int compareVersion(String version1, String version2) {
        int i = 0, j = 0;
        int l1 = version1.length(), l2 = version2.length();
        while (i < l1 || j < l2) {
            int n1 = 0, n2 = 0;//超长就不走while了,直接=0
            while (i < l1 && version1.charAt(i) != '.') {//不用加'.' i < l1就ok
                n1 = n1 * 10 + version1.charAt(i) -'0';
                i++;
            }
            while (j < l2 && version2.charAt(j) != '.') {
                n2 = n2 * 10 + version2.charAt(j) -'0';
                j++;
            }
            if (n1 > n2) {
                return 1;
            } else if (n1 < n2) {
                return -1;
            } //如果这里else return0,像1.0.0.5 1.0这样的不好判断
            i++;//别忘了
            j++;
        }
        //v1 v2相同,跳出循环。
        return 0;
    }
}

方法二 :split

class Solution {
    public int compareVersion(String version1, String version2) {
        String[] v1 = version1.split("\\.");
        String[] v2 = version2.split("\\.");
        int i = 0, j = 0;
        int l1 = v1.length, l2 = v2.length;
        while (i < l1 || j < l2) {
            //自动去除前导0
            int n1 = i < l1 ? Integer.parseInt(v1[i]) : 0;//如果到头了,后面补零
            int n2 = j < l2 ? Integer.parseInt(v2[j]) : 0;//如果到头了,后面补零
            if (n1 > n2) {
                return 1;
            } else if (n1 < n2) {
                return -1;
            }
            i++;
            j++;
        }
        //v1 v2相同,跳出循环。
        return 0;
    }
}

方法三:substring

class Solution {
    public int compareVersion(String version1, String version2) {
        String v1 = version1 + ".";//用substring,一定要加
        String v2 = version2 + ".";
        int i = 0, j = 0, pre1 = 0, pre2 = 0;
        int l1 = v1.length(), l2 = v2.length();
        while (i < l1 || j < l2) {
            while (i < l1 && v1.charAt(i) != '.') {
                i++;
            }
            while (j < l2 && v2.charAt(j) != '.') {
                j++;
            }
            //自动去除前导0
            int n1 = i < l1 ? Integer.parseInt(v1.substring(pre1, i)) : 0;//如果到头了,后面补零
            int n2 = j < l2 ? Integer.parseInt(v2.substring(pre2, j)) : 0;//如果到头了,后面补零
            if (n1 > n2) {
                return 1;
            } else if (n1 < n2) {
                return -1;
            }
            i++;
            j++;
            pre1 = i;
            pre2 = j;
        }
        //v1 v2相同,跳出循环。
        return 0;
    }
}