版本号比较

100 阅读3分钟

题目解析:版本号比较

题目描述

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

思路

  1. 分割版本号

    • 使用 split 方法将版本号按照 . 分割成修订号数组。
  2. 比较修订号

    • 遍历两个版本号的修订号数组,逐个比较修订号。
    • 如果某个版本号的修订号数组较短,则认为该位置的修订号为 0
  3. 忽略前导零

    • 使用 Integer.parseInt 将修订号字符串转换为整数,这样可以自动忽略前导零。
  4. 返回结果

    • 如果某个修订号不相等,则根据大小关系返回 1 或 -1
    • 如果所有修订号都相等,则返回 0

图解

假设有两个版本号 version1 = "1.0.1" 和 version2 = "1.0"

  1. 分割版本号

    • version1 分割后为 ["1", "0", "1"]
    • version2 分割后为 ["1", "0"]
  2. 比较修订号

    • 第1个修订号:1 vs 1,相等。
    • 第2个修订号:0 vs 0,相等。
    • 第3个修订号:1 vs 01 > 0,返回 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) {
    // 分割版本号
    String[] v1Parts = version1.split("\\.");
    String[] v2Parts = version2.split("\\.");
    
    // 获取修订号数组的长度
    int len1 = v1Parts.length;
    int len2 = v2Parts.length;
    
    // 遍历修订号
    for (int i = 0; i < Math.max(len1, len2); i++) {
        // 获取当前修订号,如果超出数组长度则视为0
        int v1 = (i < len1) ? Integer.parseInt(v1Parts[i]) : 0;
        int v2 = (i < len2) ? Integer.parseInt(v2Parts[i]) : 0;
        
        // 比较修订号
        if (v1 > v2) {
            return 1;
        } else if (v1 < v2) {
            return -1;
        }
    }
    
    // 如果所有修订号都相等
    return 0;
}
}

知识总结

在刷题过程中,我学到了以下几个知识点:

  1. 字符串分割:使用 split 方法将字符串按照指定分隔符分割成数组。
  2. 数组遍历:使用 for 循环遍历数组,并处理数组长度不一致的情况。
  3. 字符串转换为整数:使用 Integer.parseInt 方法将字符串转换为整数,自动忽略前导零。

学习建议

  • 理解题目要求:在开始编写代码之前,确保完全理解题目的要求和输入输出格式。
  • 逐步实现:先实现基本功能,再逐步优化和处理边界情况。
  • 测试用例:编写多个测试用例,确保代码在各种情况下都能正确运行。

学习计划

  1. 制定刷题计划

    • 每天刷一定数量的题目,逐步增加难度。
    • 按照数据结构和算法分类刷题,系统性地掌握知识点。
  2. 利用错题进行针对性学习

    • 记录错题,分析错误原因,并进行针对性练习。
    • 定期回顾错题,确保不再犯同样的错误。

工具运用

  1. 结合AI刷题功能

    • 使用豆包MarsCode AI刷题功能,获取题目解析和代码提示。
    • 结合其他在线编程平台(如LeetCode、牛客网)进行练习。
  2. 多资源结合

    • 结合书籍、视频教程等资源,系统学习数据结构和算法。
    • 参与编程社区和讨论,与其他学习者交流经验。