比较版本号

182 阅读2分钟

问题描述

给你两个版本号 version1version2,请你比较它们。

版本号由一个或多个修订号组成,各修订号由一个 . 连接。每个修订号由多位数字组成,可能包含前导零。每个版本号至少包含一个字符。修订号从左到右编号,下标从 0 开始,最左边的修订号下标为 0,下一个修订号下标为 1,以此类推。例如,2.5.330.1 都是有效的版本号。

比较版本号时,请按从左到右的顺序依次比较它们的修订号。比较修订号时,只需比较忽略任何前导零后的整数值。也就是说,修订号 1 和修订号 001 相等。如果版本号没有指定某个下标处的修订号,则该修订号视为 0。例如,版本 1.0 小于版本 1.1,因为它们下标为 0 的修订号相同,而下标为 1 的修订号分别为 010 < 1

返回规则如下:

  • 如果 version1 > version2 返回 1
  • 如果 version1 < version2 返回 -1
  • 除此之外返回 0

思路

分别将两个版本号按'.'分割,再把分割后的那些数字依次比较,要注意在 Java 中,“.” 在正则表达式中有特殊含义,表示匹配任意单个字符,要在前面加两个反斜线,split("\.")

为了方便计算,我写了一个函数假设前面一个字符串数组的长度更长,然后依次比较

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);
    System.out.println(solution("1.32.1", "1.32.0") == 1);
}

public static int solution(String version1, String version2) {
    // Edit your code here
    
    String[] ver1=version1.split("\\.");
    String[] ver2=version2.split("\\.");
    if(ver1.length>ver2.length){
        return compare(ver1, ver2);

    }else{//如果ver2的长度更长,那么返回的大于小于就是相反的
        int x= compare(ver2, ver1);
        if(x==1){
            return -1;
        }else if(x==-1){
            return 1;
        }else return 0;
    }


}

public static int compare(String[] s1,String[] s2){
    //默认s1版本号更长
    int equalcnt=0,i;
    for(i=0;i<s1.length&&i<s2.length;i++){
        int num1=Integer.parseInt(s1[i]);
        int num2=Integer.parseInt(s2[i]);
        if(num1>num2){
            return 1;
        }else if(num2>num1){
            return -1;
        }else{
            equalcnt++;
        }

    }

    //s1前面等于s2,如果s1后面还有大于s2的则直接返回1
    //否则判断前面相等的个数
    while (i<s1.length) {
        int num1=Integer.parseInt(s1[i]);
        if(num1>0){
            return 1;
        }
        i++;
    }

    if(equalcnt==s2.length){
        return 0;
    }

    return 1;
}

}`