版本号比较-青训营X豆包MarsCode 技术训练营刷题分享 | 豆包MarsCode AI 刷题

87 阅读4分钟

一、题目解析:版本号比较问题

问题描述

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

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

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

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

输入

  • version1: 第一个版本号
  • version2: 第二个版本号

返回

  • 比较结果,1 表示 version1 更新,-1 表示 version2 更新,0 表示两个版本相同。

参数限制

  • 1 <= version1.lengthversion2.length <= 500
  • version1 和 version2 仅包含数字和 .

题目思路

  1. 分割版本号:使用 split 方法将版本号按 . 分割成数组。
  2. 比较修订号:从左到右依次比较两个版本号的修订号,忽略前导零,直接比较整数值。
  3. 处理长度不同的情况:如果一个版本号的修订号数量少于另一个版本号,缺失部分默认补为 0
  4. 返回结果:根据比较结果返回 1-1 或 0

具体操作步骤

  1. 分割版本号

    • 使用 split("\.") 方法将 version1 和 version2 分割成数组 v1 和 v2
  2. 比较修订号

    • 遍历两个数组,依次比较对应位置的修订号。
    • 如果 v1[i] 转换为整数后大于 v2[i],返回 1
    • 如果 v1[i] 转换为整数后小于 v2[i],返回 -1
  3. 处理长度不同的情况

    • 如果 v1 的长度大于 v2,检查 v1 剩余部分是否全为 0,如果不是,返回 1
    • 如果 v2 的长度大于 v1,检查 v2 剩余部分是否全为 0,如果不是,返回 -1
  4. 返回结果

    • 如果所有修订号都相同,返回 0

代码实现

    public static int solution(String version1, String version2) {
        // Edit your code here
        String[] v1 = version1.split("\\.");
        String[] v2 = version2.split("\\.");
        int l1 = v1.length;
        int l2 = v2.length;


            for (int i = 0; i < l1 && i < l2; i++) {
                int re1 = Integer.parseInt(v1[i]);
                int re2 = Integer.parseInt(v2[i]);
                if (re1 > re2) {
                    return 1;
                }
                if (re1 < re2) {
                    return -1;
                } else {
                    continue;
                }
            }
            //若由于长度不同未比较出结果
            //已知此时前l1-l2的部分相同
        if (l1 > l2) {
            for(int i=l1-l2; i<l1; i++) {
                int re1 = Integer.parseInt(v1[i]);
                if(re1!=0)
                    return 1;
            }
        }
        if(l2 > l1) {
            for(int i=l2-l1; i<l2; i++) {
                int re2 = Integer.parseInt(v2[i]);
                if(re2!=0)
                    return -1;
            }
        }
        return 0;
    }
}

二、知识总结:字符串操作和正则

Java 中的字符串操作

Java 中的字符串是通过 String 类来表示的。以下是一些常用的字符串操作方法:

  1. 创建字符串

    String str1 = "Hello, World!";
    String str2 = new String("Hello, World!");
    
  2. 字符串长度

    int length = str1.length();
    
  3. 字符串拼接

    String str3 = str1 + " How are you?";
    String str4 = str1.concat(" How are you?");
    
  4. 字符串比较

    boolean isEqual = str1.equals(str2);
    boolean isEqualIgnoreCase = str1.equalsIgnoreCase(str2);
    int comparison = str1.compareTo(str2);
    
  5. 查找子字符串

    boolean contains = str1.contains("World");
    int index = str1.indexOf("World");
    int lastIndex = str1.lastIndexOf("o");
    boolean startsWith = str1.startsWith("Hello");
    boolean endsWith = str1.endsWith("World!");
    
  6. 提取子字符串

    String subStr1 = str1.substring(7);
    String subStr2 = str1.substring(712);
    
  7. 字符串替换

    String replacedStr = str1.replace("World""Java");
    String replacedAllStr = str1.replaceAll("o""0");
    
  8. 字符串拆分

    String[] parts = str1.split(", ");
    
  9. 去除空白

    String trimmedStr = str1.trim();
    
  10. 转换大小写

    String upperStr = str1.toUpperCase();
    String lowerStr = str1.toLowerCase();
    
  11. 字符串转字符数组

    char[] charArray = str1.toCharArray();  
    
  • splitsplit(String regex) 方法根据给定的正则表达式分割字符串,返回字符串数组。
  • Integer.parseInt:将字符串解析为整数,忽略前导零。

正则表达式简介

正则表达式(Regular Expression,简称 regex)是一种用于匹配字符串的模式。它可以用于查找、替换、验证字符串等操作。

常用正则表达式符号

  • .:匹配任意单个字符。
  • *:匹配前面的字符零次或多次。
  • +:匹配前面的字符一次或多次。
  • ?:匹配前面的字符零次或一次。
  • \d:匹配任意数字。
  • \w:匹配任意字母、数字或下划线。
  • \s:匹配任意空白字符。
  • ^:匹配字符串的开头。
  • $:匹配字符串的结尾。
  • []:匹配括号内的任意字符。
  • |:表示或运算。

Java 中的正则表达式

在 Java 中,正则表达式通常用于字符串的匹配、查找和替换操作。常用的方法有:

  • String.split(String regex):根据正则表达式分割字符串,返回字符串数组。
  • String.matches(String regex):判断字符串是否匹配正则表达式。
  • String.replaceAll(String regex, String replacement):将匹配正则表达式的部分替换为指定字符串。