首页 > 试题广场 >

比较版本号

[编程题]比较版本号
  • 热度指数:100212 时间限制: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          
发表于 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)
双指针查找,具体思路如下
public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 比较版本号
     * @param version1 string字符串 
     * @param version2 string字符串 
     * @return int整型
     */
    public int compare (String version1, String version2) {
        // write code here
        int i = 0, j = 0; // i是version1指针,j是version2指针
        // sum1存储version1中根据小数点分组的每一组版本之和,
        // sum2存储version2中根据小数点分组的每一组版本之和
        long sum1,sum2;

        // 由题得知:
        //          如果版本号没有指定某个下标处的修订号,则该修订号视为0。
        //          例如,"1.1"的版本号小于"1.1.1"。因为"1.1"的版本号相当于"1.1.0",第3位修订号的下标为0,小于1
        // 所以 i或j 其中一个符合条件则while继续。 (假设i下标已经越界,那么sum1的版本就是0,不会再继续从version1中获取版本号)
        while (i < version1.length() || j < version2.length()){
            // 设置初始值sum1 sum2 都为0
            sum1 = 0; sum2 = 0;
            // 只要i不越界,并且没有匹配到小数点时 一直内循环查找version1 , 这里的小数点判断实际上是将版本号根据小数点进行分组,每一组进行比较
            while (i < version1.length() && ! ".".equals(version1.substring(i, i + 1))){
                // sum1 * 10的原因是将上次结果的位数进一,然后再加上本次的数
                sum1 = sum1 * 10 + Long.parseLong(version1.substring(i, i + 1)) ;
                ++i; // 指针后移
            }
            // 当退出循环时,指针继续后移,这里考虑到了while退出的原因是匹配到了小数点,那么这里后移一位,等于跳过小数点,下次大循环会继续从下一段开始
            ++i;

            // 只要j不越界,并且没有匹配到小数点时 一直内循环查找version2 , 这里的小数点判断实际上是将版本号根据小数点进行分组,每一组进行比较
            while (j < version2.length() && ! ".".equals(version2.substring(j, j + 1))){
                // sum2 * 10的原因是将上次结果的位数进一,然后再加上本次的数
                sum2 = sum2 * 10 + Long.parseLong(version2.substring(j, j + 1));
                ++j;// 指针后移
            }
            // 当退出循环时,指针继续后移,这里考虑到了while退出的原因是匹配到了小数点,那么这里后移一位,等于跳过小数点,下次大循环会继续从下一段开始
            ++j;
            
            // 上面两个while退出后,比较当前这一段的版本号大小
            if(sum1 > sum2){
                return 1;
            }else if(sum1 < sum2){
                return -1;
            }
        }
        // 循环没有得到返回时,最终返回0
        return 0;
    
    }
}


发表于 2022-10-31 19:18:21 回复(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[] versions_1=version1.split("\\.");
        String[] versions_2=version2.split("\\.");
        int Max_len=Math.min(versions_1.length,versions_2.length);
        for(int index=0;index<Max_len;index++){
                int num1=Integer.valueOf(versions_1[index]).intValue();
                int num2=Integer.valueOf(versions_2[index]).intValue();
                if(num1>num2){
                    return 1;
                }else if(num1<num2){
                    return -1;
                }else{
                    continue;
                }
        }
        if(versions_1.length>versions_2.length){
            for(int i=versions_2.length;i<versions_1.length;i++){
                if(Integer.valueOf(versions_1[i]).intValue()!=0){
                    return 1;
                }
            }
            return 0;
           
        }else if(versions_1.length<versions_2.length){
            for(int i=versions_1.length;i<versions_2.length;i++){
                if(Integer.valueOf(versions_2[i]).intValue()!=0){
                    return -1;
                }
            }
            return 0;
        }else{
            return 0;
        }
    }

}

发表于 2022-09-08 20:22: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
        String[] arr1=version1.split("\\.");
        String[] arr2=version2.split("\\.");
        
       
        int i=0;
        int j=0;
        while(i<arr1.length&&j<arr2.length){
            int val1=Integer.parseInt(arr1[i]);
            int val2=Integer.parseInt(arr2[i]);
            if(val1>val2){
                return 1;
            }else if(val1<val2){
                return -1;
            }
            i++;
            j++;
        }
        while(i<arr1.length){
            int val=Integer.parseInt(arr1[i]);
            if(val>0){
                return 1;
            }
            i++;
        }
        
        while(j<arr2.length){
            int val=Integer.parseInt(arr2[j]);
            if(val>0){
                return -1;
            }
            j++;
        }
        
        return 0;
        
    }
}

发表于 2022-09-01 22:31:06 回复(0)
这个比较版本的题目和二分查找没啥关系呀 
发表于 2022-08-24 14:26:20 回复(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
        //第一个为版本号,先对比版本号
        //后面的为修订号,如果有前导0忽略掉,如果后面没有0默认为0
        String[] ver1 = version1.split("\\.");
        String[] ver2 = version2.split("\\.");
        int len = Math.max(ver1.length,ver2.length);
        for(int i = 0;i<len;i++){
            int t1 = i<ver1.length?Integer.parseInt(ver1[i]):0;
            int t2 = i<ver2.length?Integer.parseInt(ver2[i]):0;
            if(t1 > t2) return 1;
            else if(t1 < t2) return -1;
        }
        return 0;
    }
}

发表于 2022-08-12 10:36:14 回复(1)

问题信息

上传者:牛客332641号
难度:
51条回答 11668浏览

热门推荐

通过挑战的用户

查看代码