版本号比较问题解决方法

108 阅读3分钟

问题描述

在某个项目中,每个版本都用版本号标记,由一个或多个修订号组成,修订号之间由点号.分隔。每个修订号可能有多位数字,并且可能会包含前导零。你需要根据两个版本号 version1 和 version2,判断哪个版本更新,或者它们是否相同。

例如,2.5.33 和 0.1 都是有效的版本号。

当比较两个版本时,从左到右依次比较它们的修订号。忽略每个修订号的前导零,直接比较修订号对应的整数值。如果其中一个版本没有足够的修订号,缺失部分默认补为0

你需要根据以下规则返回比较结果:

  • 如果 version1 > version2,返回 1
  • 如果 version1 < version2,返回 -1
  • 如果两个版本相等,返回 0

测试样例

样例1:

输入:version1 = "0.1" , version2 = "1.1"
输出:-1

样例2:

输入:version1 = "1.0.1" , version2 = "1"
输出:1

样例3:

输入:version1 = "7.5.2.4" , version2 = "7.5.3"
输出:-1

样例4:

输入:version1 = "1.0" , version2 = "1.0.0"
输出:0

解决代码呈现

public class Main {
    public static void main(String[] args) {
        System.out.println(solution("0.1", "1.1") == -1);
        System.out.println(solution("1.0.1", "1") == 1);
        System.out.println(solution("7.5.2.4", "7.5.3") == -1);
        System.out.println(solution("1.0", "1.0.0") == 0);
    }

    public static int solution(String version1, String version2) {
        String[] parts1 = version1.split("\\.");
        String[] parts2 = version2.split("\\.");

        int length = Math.max(parts1.length, parts2.length);
        for (int i = 0; i < length; i++) {
            int num1 = i < parts1.length ? Integer.parseInt(parts1[i]) : 0;
            int num2 = i < parts2.length ? Integer.parseInt(parts2[i]) : 0;

            if (num1 < num2) {
                return -1;
            } else if (num1 > num2) {
                return 1;
            }
        }

        return 0;
    }
}

解题思路:

  1. 理解问题:我们需要比较两个版本号,确定哪个版本号更新,或者它们是否相同。版本号由点号分隔的多个部分组成,每个部分是一个数字,可能会包含前导零。
  2. 拆分版本号:将每个版本号按照点号拆分成一个数组,数组中的每个元素代表一个修订号。
  3. 比较修订号:逐个比较两个版本号数组的修订号。比较时,应忽略前导零,并比较整数大小。 处理不同长度:如果两个版本号的数组长度不同,对于缺失的部分,应视为0。 返回结果:根据比较结果返回相应的值:如果第一个版本号更新,返回1;如果第二个版本号更新,返回-1;如果两者相同,返回0。

解决方法步骤:

  1. 分割版本号: 使用String.split("\.")方法将版本号字符串分割成字符串数组。例如,"1.0.1"会被分割成["1", "0", "1"]。
  2. 确定比较长度: 使用Math.max(parts1.length, parts2.length)来确定需要比较的长度,这样可以确保比较过程中不会出现数组越界的情况。
  3. 循环比较修订号: 使用一个for循环,循环次数为两个版本号数组长度的最大值。 在每次循环中,获取两个版本号在当前位置的修订号。如果数组长度不足,则使用0作为默认值。
  4. 转换并比较修订号: 使用Integer.parseInt(parts[i])将字符串修订号转换为整数,以便比较。 比较两个整数修订号的大小,并根据比较结果返回相应的值。
  5. 返回比较结果: 如果在比较过程中发现一个版本号的修订号小于另一个,则立即返回-1。 如果一个版本号的修订号大于另一个,则立即返回1。 如果所有修订号都相等,循环结束后返回0。