首页 > 试题广场 >

比较版本号

[编程题]比较版本号
  • 热度指数:113337 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
牛客项目发布项目版本时会有版本号,比如1.02.11,2.14.4等等
现在给你2个版本号version1和version2,请你比较他们的大小
版本号是由修订号组成,修订号与修订号之间由一个"."连接。1个修订号可能有多位数字组成,修订号可能包含前导0,且是合法的。例如,1.02.11,0.1,0.2都是合法的版本号
每个版本号至少包含1个修订号。
修订号从左到右编号,下标从0开始,最左边的修订号下标为0,下一个修订号下标为1,以此类推。

比较规则:
一. 比较版本号时,请按从左到右的顺序依次比较它们的修订号。比较修订号时,只需比较忽略任何前导零后的整数值。比如"0.1"和"0.01"的版本号是相等的
二. 如果版本号没有指定某个下标处的修订号,则该修订号视为0。例如,"1.1"的版本号小于"1.1.1"。因为"1.1"的版本号相当于"1.1.0",第3位修订号的下标为0,小于1
三.  version1 > version2 返回1,如果 version1 < version2 返回-1,不然返回0.

数据范围:
version1 和 version2 的修订号不会超过int的表达范围,即不超过 32 位整数 的范围

进阶: 空间复杂度 , 时间复杂度
示例1

输入

"1.1","2.1"

输出

-1

说明

version1 中下标为 0 的修订号是 "1",version2 中下标为 0 的修订号是 "2" 。1 < 2,所以 version1 < version2,返回-1
示例2

输入

"1.1","1.01"

输出

0

说明

version2忽略前导0,为"1.1",和version相同,返回0          
示例3

输入

"1.1","1.1.1"

输出

-1

说明

"1.1"的版本号小于"1.1.1"。因为"1.1"的版本号相当于"1.1.0",第3位修订号的下标为0,小于1,所以version1 < version2,返回-1          
示例4

输入

"2.0.1","2"

输出

1

说明

version1的下标2>version2的下标2,返回1          
示例5

输入

"0.226","0.36"

输出

1

说明

226>36,version1的下标2>version2的下标2,返回1          
比较简易的写法
import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 比较版本号
     * @param version1 string字符串 
     * @param version2 string字符串 
     * @return int整型
     */
    public int compare (String version1, String version2) {
        // write code here
        String[] s1 = version1.split("\\.");
        String[] s2 = version2.split("\\.");
        for(int i = 0; i < s1.length; i++){
            if(s2.length > i){
                int a = Integer.parseInt(s1[i]);
                int b = Integer.parseInt(s2[i]);
                if(a < b){
                    return -1;
                }else if(a > b){
                    return 1;
                }
            }else {
                return 1;
            }
        }
        return 0;
    }
}


发表于 2024-10-16 15:48:51 回复(0)
public int compare (String version1, String version2) {
        String[] v1 = version1.split("\\.");
        String[] v2 = version2.split("\\.");
        int n1,n2;
        for(int i=0;i<v1.length || i<v2.length;i++){
            n1 = i >= v1.length ? 0 : Integer.parseInt(v1[i]);
            n2 = i >= v2.length ? 0 : Integer.parseInt(v2[i]);
            if(n1 == n2) continue;
            return n1 > n2 ? 1 : -1;
        }
        return 0;
    }

    public int[] trans(String version){
        String[] s = version.split("\\.");
        int[] ss = new int[1000];
        for(int i=0;i<s.length;i++){
            ss[i] = Integer.parseInt(s[i]);
        }
        return ss;
    }

发表于 2024-08-24 09:51:11 回复(0)
import java.util.*;

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 比较版本号
     * @param version1 string字符串
     * @param version2 string字符串
     * @return int整型
     */
    public int compare (String version1, String version2) {
        // write code here

        String[] v1 = version1.contains(".") ? version1.split("\\.") : new String[] {version1};
        String[] v2 = version2.contains(".") ? version2.split("\\.") : new String[] {version2};

        ArrayList<String> lv1 = new ArrayList<String>();
        lv1.addAll(Arrays.asList(v1));
        ArrayList<String> lv2 = new ArrayList<String>();
        lv2.addAll(Arrays.asList(v2));

        if (lv1.size() > lv2.size()) {
            for (int i = lv2.size(); i < lv1.size() ; i++) {
                lv2.add("0");
            }
        } else if (lv1.size() < lv2.size()) {
            for (int i = lv1.size(); i < lv2.size(); i++) {
                lv1.add("0");
            }
        }

        for (int i = 0; i < lv1.size(); i++) {
            if (Integer.parseInt(lv1.get(i)) > Integer.parseInt(lv2.get(i))) {
                return 1;
            }

            if (Integer.parseInt(lv1.get(i)) < Integer.parseInt(lv2.get(i))) {
                return -1;
            }
        }

        return 0;
    }
}
发表于 2024-08-01 13:51:42 回复(0)
import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 比较版本号
     * @param version1 string字符串
     * @param version2 string字符串
     * @return int整型
     */
    public int compare (String version1, String version2) {
        // write code here

        // 算法的时间复杂度O(N),空间复杂度O(N)

        // 1.先对两个版本字符串按照.分割成字符串数组
        // 注意!正则中应该填入"\\."而非"."
        String[] split1 = version1.split("\\.");
        String[] split2 = version2.split("\\.");

        // 2.针对split中的每个元素,将其转化成为int类型比较
        int max = Math.max(split1.length, split2.length);
        for (int i = 0; i < max; i++) {
            // 2.1 先给每个int赋值0,以防该字符串的下标已经越界
            int i1 = 0;
            int i2 = 0;
            // 2.2 若不越界,则赋对应的值
            if (i < split1.length) {
                i1 = Integer.parseInt(split1[i]);
            }
            if (i < split2.length) {
                i2 = Integer.parseInt(split2[i]);
            }
            // 2.3 若产生大小关系,则直接返回对应的结果值
            if (i1 > i2) {
                return 1;
            }
            if (i1 < i2) {
                return -1;
            }
            // 2.4 若相等,则继续下一轮
        }
        // 3.两个版本号相等,返回0
        return 0;
    }
}

发表于 2024-07-27 23:15:19 回复(0)
几年前头次刷写的挺乱的,觉得有点麻烦,现在二刷发现在转成数值过程中自动就忽略了前导0,同时当一个version长度不一致时,扫尾只需要判断是否存在非0值即可,这么写起来清晰多了,瞬间就不觉得麻烦了hhh
import java.util.*;

public class Solution {
    public int compare (String v1, String v2) {
        int i = 0, j = 0, x = 0, y = 0, len1 = v1.length(), len2 = v2.length();
        while ( i < len1 && j < len2 ) {
            // tranfer to number ignore lead 0
            x = 0;
            while (i < len1 && v1.charAt(i) != '.' ) x = x * 10 + v1.charAt(i++) - '0';
            y = 0;
            while (j < len2 && v2.charAt(j) != '.') y = y * 10 + v2.charAt(j++) - '0';

            if (x > y) return 1;
            if (x < y) return -1;

            // skip dot
            i++; j++;
        }

        // suffix exist non zero value
        while (i < len1) { if (v1.charAt(i) != '0' && v1.charAt(i) != '.') return 1; i++; }
        while (j < len2) { if (v2.charAt(j) != '0' && v2.charAt(j) != '.') return -1; j++; }

        return 0;
    }
}


发表于 2024-07-22 17:59:51 回复(0)
发表于 2024-04-22 20:15:28 回复(0)
public int compare (String version1, String version2) {
    // write code here
    if (version1 == null && version2 == null) return 0;
    else if (version1 != null && version2 == null) return 1;
    else if (version2 != null && version1 == null) return -1;  

    String[] arr1 = version1.split("\\.");
    String[] arr2 = version2.split("\\.");
    int cm = 0;
    int maxIdx = arr1.length > arr2.length ? arr1.length : arr2.length;
    for(int i=0;i < maxIdx;i++) {
        int a, b;
        if (i >= arr1.length) a = 0;
        else a = Integer.parseInt(arr1[i]);

        if (i >= arr2.length) b = 0;
        else b = Integer.parseInt(arr2[i]);

        cm = Integer.compare(a, b);
        if (cm != 0) return cm;
    }

    return cm;
}

发表于 2024-04-15 10:42:11 回复(0)
import java.util.*;
import java.math.*;
public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 比较版本号
     * @param version1 string字符串
     * @param version2 string字符串
     * @return int整型
     */
    public int compare (String version1, String version2) {
        // write code here
        String[] version1Array =  version1.split("\\.");
        String[] version2Array =  version2.split("\\.");
        System.out.println(version1Array.length);
        System.out.println(version2Array.length);
        int shortLen = Math.min(version1Array.length, version2Array.length);
        int longLen = Math.max(version1Array.length, version2Array.length);
        int temp1 = 0, temp2 = 0;
        for (int i = 0; i < shortLen; i++) {
            temp1 = Integer.valueOf(version1Array[i]);
            temp2 =  Integer.valueOf(version2Array[i]);
            if (temp1 > temp2) {
                return 1;
            }
            if (temp1 < temp2) {
                return -1;
            }
        }
        if (version1Array.length != version2Array.length) {
            int sum = 0;
            for (int item = shortLen; item < longLen; item++) {
                sum += Integer.valueOf(version1Array.length > version2Array.length ?
                                       version1Array[item] : version2Array[item]);
            }
            if (sum == 0) {
                return 0;
            }
        }


        if (version1Array.length < version2Array.length) {
            return -1;
        }
        if (version1Array.length > version2Array.length) {
            return 1;
        }

        return 0;
    }
}
编辑于 2024-03-24 16:05:05 回复(0)
暴力破解版本号:

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 比较版本号
     * @param version1 string字符串
     * @param version2 string字符串
     * @return int整型
     */
    public int compare (String version1String version2) {
        // write code here
        String[] arr1 = version1.split("\\.");
        String[] arr2 = version2.split("\\.");
        for(int i=arr1.length-1;i>0;i--){
            String s = arr1[i];
            Integer num = Integer.valueOf(s);
            if(num == 0){
                arr1[i] = null;
            } else {
                break;
            }
        }
        for(int i=arr2.length-1;i>0;i--){
            String s = arr2[i];
            Integer num = Integer.valueOf(s);
            if(num == 0){
                arr2[i] = null;
            } else {
                break;
            }
        }
        version1 = "";
        for(int i=0;i<arr1.length;i++){
            String s = arr1[i];
            if(s == null){
                break;
            } else {
                Integer num = Integer.valueOf(s);
                arr1[i] = lpad(num + "");
                version1 += arr1[i] + ".";
            }
        }
        version2 = "";
        for(int i=0;i<arr2.length;i++){
            String s = arr2[i];
            if(s == null){
                break;
            } else {
                Integer num = Integer.valueOf(s);
                arr2[i] = lpad(num + "");
                version2 += arr2[i] + ".";
            }
        }
       
        return version1.compareTo(version2) > 0?1:version1.compareTo(version2) < 0?-1:0;
    }

    private String lpad(String num){
        //不超过 32 位整数 的范围
        num = "000000000000000000000000000000000"+num;
        return num.substring(num.length()-32);
    }
}

发表于 2024-02-25 16:25:44 回复(0)
public class Solution {
    int idx1 = 0, idx2 = 0, n1 = 0, n2 = 0;

    public int compare (String version1, String version2) {
        while (idx1 < version1.length() || idx2 < version2.length()) {
            handleStr((idx, n) -> {
                idx1 = idx;
                n1 = n;
            }, idx1, version1);
            handleStr((idx, n) -> {
                idx2 = idx;
                n2 = n;
            }, idx2, version2);
            if (n1 != n2) {
                return n1 < n2 ? -1 : 1;
            }
        }
        return 0;
    }

    private void handleStr(BiConsumer<Integer, Integer> fun, int i,
                           String str) {
        int n = 0;
        for (; i < str.length() && str.charAt(i) != '.'; i++) {
            n = n * 10 + (str.charAt(i) - '0');
        }
        fun.accept(i + 1, n);// 将得到的结果回调
    }
}
发表于 2023-09-16 23:18:35 回复(0)
public int compare (String version1, String version2) {
        // 用双指针遍历两个字符串
        //截取.之前的数字,  
        //比较数字大小,返回1、-1;如果全部比较完都没有结果,返回0
        //关键在于处理前导0:加在前面数字乘10的后面   010-->10   00010-->10
        int i=0;
        int j=0;
        while(i<version1.length()||j<version2.length()){
            long num1=0;
            long num2=0;
            //处理version1
            while(i<version1.length()&&version1.charAt(i)!='.'){//按.截取数字
                int tmp1=version1.charAt(i)-'0';
                num1=num1*10+tmp1;
                i++;
            }
            i++;//跳过.

            //处理version2
            while(j<version2.length()&&version2.charAt(j)!='.'){
                int tmp2=version2.charAt(j)-'0';
                num2=num2*10+tmp2;
                j++;
            }
            j++;//跳过.
            //比较数字
            if(num1>num2) return 1;
            if(num1<num2) return -1;
        }
        return 0;
    }

发表于 2023-07-30 11:56:46 回复(0)
public int compare (String version1, String version2) {
    // write code here
    String[] v1 = version1.split("\\.");
    String[] v2 = version2.split("\\.");
    int v1val, v2val;
    int k = v1.length < v2.length ? v2.length : v1.length;
    for (int i = 0; i < k; i++) {
        v1val = v1.length <= i ? 0 : Integer.parseInt(v1[i]);
        v2val = v2.length <= i ? 0 : Integer.parseInt(v2[i]);
        if(v1val < v2val){
            return -1;
        }else if(v1val > v2val){
            return 1;
        }
    }
    return 0;
}

发表于 2023-07-19 21:48:33 回复(0)
import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 比较版本号
     * @param version1 string字符串
     * @param version2 string字符串
     * @return int整型
     */
    public int compare (String version1, String version2) {
        // write code here
        //保存每个版本号的数字
        ArrayList<String> ves1 = new ArrayList<>();
        ArrayList<String> ves2 = new ArrayList<>();
        String str = "";
        //保存version1的数字到ves1集合
        for (int i = 0; i < version1.length(); i++) {
            str += version1.charAt(i);
            if (version1.charAt(i) == '.') {
                ves1.add(str.substring(0, str.length()-1));
                str = "";
            }
            if (i == version1.length() - 1 && !str.isEmpty()) {
                ves1.add(str);
            }
        }
        //保存version2的数字到ves2集合
        str="";
        for (int i = 0; i < version2.length(); i++) {
            str += version2.charAt(i);
            if (version2.charAt(i) == '.') {
                ves2.add(str.substring(0, str.length()-1));
                str = "";
            }
            if (i == version2.length() - 1 && !str.isEmpty()) {
                ves2.add(str);
            }
        }
        //保证二者size相同
        if(ves1.size()>ves2.size()){
            getBalance(ves1,ves2);
        }else{
            getBalance(ves2,ves1);
        }
        //进行对前导零的优化
        optimize(ves1);
        optimize(ves2);
        //进行比较
        for(int i=0;i<ves1.size();i++){
            Integer num1=Integer.valueOf(ves1.get(i));
            Integer num2=Integer.valueOf(ves2.get(i));
            if(num1>num2){
                return 1;
            }else if(num1<num2){
                return -1;
            }
        }
        return 0;
    }
    //进行优化前导零
    public void optimize(ArrayList<String> ves){
        for(int i=0;i<ves.size();i++){
            String str=ves.get(i);
            //如果碰到前导零,将该前导零放到最后一位,保证ves1和ves2的size相等
            if(i!=0&&str.equals("0")){
                ves.remove(i);
                ves.add("0");
            }
        }
    }
    //默认左边size>右边size
    //进行size相等调整
    public void getBalance(ArrayList<String> ves1,ArrayList<String> ves2){
        while(ves1.size()!=ves2.size()){
            ves2.add("0");
        }
    }
}

发表于 2023-06-13 09:07:50 回复(0)
import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 比较版本号
     * @param version1 string字符串
     * @param version2 string字符串
     * @return int整型
     */

        public static int compare(String version1, String version2) {


            //暴力波破解版本号
        String[] strNum1 = version1.split("");

        String[] strNum2 = version2.split("");
//        String[] s1 = version1.split("\\.");
//        String[] s2 = version2.split("\\.");
        StringBuilder sb1 = new StringBuilder();
        StringBuilder sb2 = new StringBuilder();

        if (strNum1.length >= strNum2.length) {
            for (int i = 0; i < strNum1.length; i++) {
                sb1.append((strNum1[i]));
                if (i > strNum2.length - 1) {

                    if (i > strNum2.length) {
                        sb2.append(".0");
                   //     System.out.println("BBBBBB" + i + "sssss+" + (strNum2.length - 1));
                    }

                } else {
                    sb2.append((strNum2[i]));
                }
            }
        } else {
            for (int i = 0; i < strNum2.length; i++) {
                sb2.append(((strNum2[i])));
                if (i > strNum1.length - 1) {
                    if (i > strNum1.length) {
                        sb1.append(".0");
                    //    System.out.println("i===" + i + "  length ==" + (strNum1.length - 1));
                    }
                } else {
                    // System.out.println("TTTTTTTTTTT  i = " + i);
                    // System.out.println(sb1.toString());
                    sb1.append(((strNum1[i])));
                }
            }
        }

        // System.out.println(sb1);
        // System.out.println(sb2);
        int i = compareInt(sb1, sb2);
        return i;
    }

   public static int compareInt(StringBuilder sb1, StringBuilder sb2) {
        String[] split1 = sb1.toString().split("\\.");
        String[] split2 = sb2.toString().split("\\.");

        for (int i = 0; i < split1.length; i++) {
            System.out.println("##########" + split1[i] + "######" + split2[i]);
            if (split1[i].equals(split2[i])) {
                continue;
            }
            if (Integer.parseInt(split1[i]) > Integer.parseInt(split2[i])) {
                return 1;
            }
            if (Integer.parseInt(split1[i]) < Integer.parseInt(split2[i])) {
                return -1;
            }
        }
        return 0;
    }
}
发表于 2023-05-08 12:04:59 回复(0)
import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 比较版本号
     * @param version1 string字符串
     * @param version2 string字符串
     * @return int整型
     */
    public int compare (String version1, String version2) {
        // write code here
        int result = 0;
        String[] ver1Arr = version1.split("\\.");
        String[] ver2Arr = version2.split("\\.");
        int length = ver1Arr.length >= ver2Arr.length ? ver1Arr.length : ver2Arr.length;
        //应该从后往前比较
        for (int i = length-1; i >= 0; i--) {

            Integer ver1Num = ver1Arr.length-1 < i?0:Integer.valueOf(ver1Arr[i]);
            Integer ver2Num = ver2Arr.length-1 < i?0:Integer.valueOf(ver2Arr[i]);
            int compareResult = ver1Num.compareTo(ver2Num);
            if (compareResult != 0) {
                result = compareResult;
            }

        }
        return result;
    }
}

发表于 2023-05-05 10:51:37 回复(0)
public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 比较版本号
     * @param version1 string字符串 
     * @param version2 string字符串 
     * @return int整型
     */
    public int compare (String version1, String version2) {
        // write code here

        String[]arr1=version1.split("[.]");//数字小数点的正则表达式为 "[.]"
        String[]arr2=version2.split("[.]");
        int max=(arr1.length>arr2.length)?arr1.length:arr2.length;
        for(int i=0;i<max;i++){           
            int num1=(i>arr1.length-1)?0:Integer.parseInt(arr1[i]);
            int num2=(i>arr2.length-1)?0:Integer.parseInt(arr2[i]);
            if(num1>num2){
                return 1;
            }
            if(num1<num2){
                return -1;
            }
        }
        return 0;
    }
} 
发表于 2022-12-09 11:03:00 回复(0)
import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 比较版本号
     * @param version1 string字符串
     * @param version2 string字符串
     * @return int整型
     */
    public int compare (String version1, String version2) {
        // write code here
        if (isBlank(version1) || isBlank(version2)) {
            return -1;
        }
       String[] str1 = version1.split("\\.");
       String[] str2 = version2.split("\\.");
       int len1 = str1.length;
       int len2 = str2.length;
       int max = Integer.max(len1, len2);
       int i = 0;
       while(i < max) {
           int i1 = i < len1 ? Integer.parseInt(str1[i]) : 0;
           int i2 = i < len2 ? Integer.parseInt(str2[i]) : 0;
           if (i1 > i2) {
               return 1;
           }else if (i1 < i2) {
               return -1;
           }
           i++;
       }
       return 0;
    }

    private boolean isBlank(String str) {
        return str == null || str.length() == 0;
    }
}

发表于 2022-11-03 08:59:57 回复(0)

问题信息

上传者:牛客332641号
难度:
56条回答 12825浏览

热门推荐

通过挑战的用户

查看代码
比较版本号