牛客网面试必刷:BM22 比较版本号

牛客网面试必刷:BM22 比较版本号


前言

牛客项目发布项目版本时会有版本号,比如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.


一、解法1:分割截取

既然方法一都是每次以点为界限,将字符转换为数字,那我们是不是可以尝试提前就把它们分割好呢?分割也不难,可以借助Java或者Pyhton的split函数直接按照点为间隔划分开。C++没有这么方便的split函数了,但是我们还有流输入istringstream,只需要用一个字符型变量承接点,其他部分就是逐渐输入数组中

具体做法:
step 1:使用split函数或者字符串流输入,按照点将两个原始字符串分割,使每个修订号的数字单独呈现在数组中。
step 2:遍历数组,每次各自取出一个数字比较,较短的版本号没有可取的数字了,就直接取0
step 3:遍历取出的数字字符串,将其转换成数字,然后比较数字大小。根据大小关系返回1或者-1,如果全部比较完都无法比较出大小关系,则返回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.split("\\.");
        String[] v2 = version2.split("\\.");
        int length = v1.length > v2.length? v2.length : v1.length;
        int flag = 0;
        int i = 0;
        for(i = 0;i <= length - 1;i++){
    
    
            int v11 = Integer.valueOf(v1[i]);
            int v22 = Integer.valueOf(v2[i]);
            if(v11 < v22) {
    
    
                flag = -1;
                break;
            }else if(v11 > v22){
    
    
                flag = 1;
                break;
            }else{
    
    
                continue;
            }
        }
        //如果v1长度更长,则比较v1后面的数字,有大于0的则v1大
        if(flag == 0 && v1.length - i > 0){
    
    
            while(i <= v1.length - 1){
    
    
                if(Integer.valueOf(v1[i]) > 0){
    
    
                    flag = 1;
                    break;
                }
                i++;
            }
        }else if(flag == 0 && v2.length - i > 0){
    
    
            while(i <= v2.length - 1){
    
    
                if(Integer.valueOf(v2[i]) > 0){
    
    
                    flag = -1;
                    break;
                }
                i++;
            }
        }
        return flag;
    }
}

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_46119575/article/details/130695412