力扣第165题-比较版本号

167 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第26天,点击查看活动详情

前言

力扣第165题 比较版本号 如下所示:

image.png

一、思路

这一题比较贴近实际,就是比较两个版本号的大小(版本号以 . 隔开,例如 1.2.3)。在从左到右比较的过程中,我们需要注意以下两点:

  • 忽略前导0,例如 1.0011.1 是相等的
  • 如果版本号中没有某下标处的修订号,则视为 0

修订号的个数:指版本号通过 . 分割得到的数组长度

我们先以最普通的例子作为比较 version1 = 7.5.3.4, version2 = 7.5.3,我们大致的处理步骤如下所示:

  1. 比较相同个数的修订号,以短一点的修订号个数为准。此处这里选取version2 的的修订号个数 3 作为基准
  2. 如步骤一比较中,修订号都相同。则比较版本号的修订号个数,修订号个数多的更大

为了解决 version1 = 1.0, version2 = 1.0.0 因修订号个数不同而导致返回了错误的结果。我们在比较前删除版本号中后面所有连续的 0,例如 1.00.0.000.0 经过删除后置零后变为 1

举个例子

此处以示例中的 version1 = 7.5.3.4, version2 = 7.5.3 作为例子

  1. 分割出修订号,arr1 = {7, 5, 3, 4}arr2 = {7, 5, 3}
  2. 选取出较短的修订号个数 minLen = 3
  3. arr1arr2 中取前 3 位进行比较,发现均相等
  4. 最后比较 arr1arr2 的修订号个数,发现 arr1.len > arr2.len,故返回 1

综上所述,处理的步骤如下所示:

  1. 去除版本号中后置零
  2. 比较前 m 个修订号,如有不相等则立即返回( m 为较短的修订号个数)
  3. 最后比较两者修订号个数

二、实现

实现代码

实现代码与思路中一致

public int compareVersion(String version1, String version2) {
    version1 = rmBehindZero(version1);
    version2 = rmBehindZero(version2);
    // 忽略后导 0
    String[] arr1  = version1.split("\.");
    String[] arr2  = version2.split("\.");
    int minLen = Math.min(arr1.length, arr2.length);
    // 开始比较
    for (int i=0; i<minLen; i++){
        int val1 = Integer.parseInt(arr1[i]);
        int val2 = Integer.parseInt(arr2[i]);
        if (val1 > val2)
            return 1;
        else if (val1 < val2)
            return -1;
    }
    // 最后比较长度
    return Integer.compare(arr1.length, arr2.length);
}

// 去除所有后置的连续0
public String rmBehindZero(String str){
    int end = str.length();
    while (end > 2){
        int sign = end; // 做个标记
        while (str.charAt(sign-1) == '0'){
            sign--;
        }
        if (str.charAt(sign-1) == '.'){
            sign--;
            end = sign;
        }else {
            break;
        }
    }
    return str.substring(0, end);
}

测试代码

public static void main(String[] args) {
    new Number165().compareVersion("1", "1.00.0.000.0");
}

结果

image.png

三、总结

感谢看到最后,非常荣幸能够帮助到你~♥

如果你觉得我写的还不错的话,不妨给我点个赞吧!如有疑问,也可评论区见~