描述

比较版本号,版本号按.分割,例如1.02.11,0.1,0.2,忽略前导0

  1. version1>version2返回1
  2. version1<version2返回-1
  3. version1==version2返回0

示例:

  1. 1.1==1.1.0
  2. 1.1==1.01

思路1:split分割数组,按块比较

空间复杂度O(m+n)

public class Solution {
    public int compare(String version1, String version2) {
        //需要转义
        String[] arr1 = version1.split("\\.");
        String[] arr2 = version2.split("\\.");
        int len1 = arr1.length;
        int len2 = arr2.length;
        int i = 0;
        while(i < len1 || i < len2) {
            //为空的话使用0占位
            int num1 = i < len1 ? Integer.parseInt(arr1[i]) : 0;
            int num2 = i < len2 ? Integer.parseInt(arr2[i]) : 0;
            if(num1 > num2) {
                return 1;
            } else if(num2 > num1){
                return -1;
            }
            i++;
        }
        return 0;
    }
}

思路2:双指针

使用双指针,动态计算每一块版本号的值,空间复杂度O(1)

public class Solution {
    public int compare(String version1, String version2) {
        int len1 = version1.length();
        int len2 = version2.length();
        int i = 0;
        int j = 0;
        while(i < len1 || j < len2) {
            //重置新块为0
            int num1 = 0;
            int num2 = 0;
            //计算一块的版本
            while(i < len1 && version1.charAt(i) != '.') {
                num1 = num1 * 10 + (version1.charAt(i) - '0');
                i++;
            } 
            while(j < len2 && version2.charAt(j) != '.') {
                num2 = num2 * 10 + (version2.charAt(j) - '0');
                j++;
            }
            if(num1 > num2) {
                return 1;
            } else if(num2 > num1){
                return -1;
            }
            i++;
            j++;
        }
        return 0;
    }
}

思路3

给每一块版本号补前导0,使得两个版本号字符串长度相等,再进行比较。

如果int越界,可以比较字符串ASCII码

例如:

  1. 1.2和1.11,给1.2补前导0,转成1.02和1.11比较,102<111