版本号比较 | 豆包MarsCode AI刷题

33 阅读3分钟

问题描述

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

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

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

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

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

好的,让我们来分析一下这个问题。

问题理解

你需要比较两个版本号 version1version2,判断哪个版本更新,或者它们是否相同。版本号由一个或多个修订号组成,修订号之间由点号 . 分隔。每个修订号可能有多位数字,并且可能会包含前导零。

数据结构选择

由于版本号是由多个修订号组成的,我们可以将每个版本号拆分成一个整数数组,这样便于逐个比较修订号。

算法步骤

  1. 拆分版本号:将 version1version2 按照 . 分隔符拆分成整数数组。
  2. 逐个比较修订号:从左到右依次比较两个版本号的修订号。
    • 如果其中一个版本号的修订号比另一个多,缺失的部分可以视为 0
    • 忽略每个修订号的前导零,直接比较修订号对应的整数值。
  3. 返回比较结果
    • 如果 version1 的某个修订号大于 version2 的对应修订号,返回 1
    • 如果 version1 的某个修订号小于 version2 的对应修订号,返回 -1
    • 如果所有修订号都相等,返回 0

示例

假设 version1 = "1.0.1"version2 = "1.0"

  1. 拆分后:version1 变成 [1, 0, 1]version2 变成 [1, 0]
  2. 比较:
    • 第一个修订号:11,相等。
    • 第二个修订号:00,相等。
    • 第三个修订号:10version1 的修订号更大。
  3. 返回结果:1

通过这种方式,你可以逐步比较两个版本号,并根据比较结果返回相应的值。希望这些思路对你有帮助!

好的,让我们基于你当前的代码框架来提供一些代码提示。

代码提示

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) {
        // 1. 将版本号按 '.' 分隔成整数数组
        String[] v1Parts = version1.split("\\.");
        String[] v2Parts = version2.split("\\.");

        // 2. 获取两个版本号的最大修订号数量
        int maxLength = Math.max(v1Parts.length, v2Parts.length);

        // 3. 逐个比较修订号
        for (int i = 0; i < maxLength; i++) {
            // 将修订号转换为整数,缺失的部分视为 0
            int v1Part = (i < v1Parts.length) ? Integer.parseInt(v1Parts[i]) : 0;
            int v2Part = (i < v2Parts.length) ? Integer.parseInt(v2Parts[i]) : 0;

            // 比较修订号
            if (v1Part > v2Part) {
                return 1;
            } else if (v1Part < v2Part) {
                return -1;
            }
            // 如果相等,继续比较下一个修订号
        }

        // 4. 如果所有修订号都相等,返回 0
        return 0;
    }
}

关键步骤解释

  1. 拆分版本号:使用 split("\\.") 方法将版本号按 . 分隔成字符串数组。
  2. 获取最大修订号数量:使用 Math.max 获取两个版本号的最大修订号数量,以便逐个比较。
  3. 逐个比较修订号
    • 使用 Integer.parseInt 将字符串修订号转换为整数。
    • 如果某个版本号的修订号数量不足,缺失的部分视为 0
    • 逐个比较修订号,如果发现不相等的修订号,直接返回比较结果。
  4. 返回结果:如果所有修订号都相等,返回 0