力扣165-比较版本号

题目

给你两个版本号 version1 和 version2 ,请你比较它们。

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

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

返回规则如下:

  • 如果 version1 > version2 返回 1

  • 如果 version1 < version2 返回 -1

  • 除此之外返回 0

示例

示例1

输入:version1 = "1.01", version2 = "1.001"
输出:0
解释:忽略前导零,"01" 和 "001" 都表示相同的整数 "1"

示例2

输入:version1 = "1.0", version2 = "1.0.0"
输出:0
解释:version1 没有指定下标为 2 的修订号,即视为 "0"

示例3

输入:version1 = "0.1", version2 = "1.1"
输出:-1
解释:version1 中下标为 0 的修订号是 "0",version2 中下标为 0 的修订号是 "1" 。0 < 1,所以 version1 < version2

解法一:拆分比较

说明:这份解法是我自己的想法,比较麻烦,一开始本来是打算转整数比较的,结果可能写错了转换方法,报错,我就以为是这道题系统不给转整数(【手动狗头】),于是就开启了这个麻烦的做法。

思路

对于每个版本号,先把修订号给截取出来,然后把它们加工成相同的长度,不够长度的左补零,然后对比每个字符,就可以得出大小,如果修订号的数目不一样多,也是采用补零,只不过这种情况下补全的那个修订号是全零。

代码

class Solution {
    public int compareVersion(String version1, String version2) {
        version1=version1+".";
        version2=version2+".";

        int left1=0,right1=0;
        int left2=0,right2=0;

        while(right2<version2.length()||right1<version1.length()){
            while(right1<version1.length()&&version1.charAt(right1)!='.'){
                right1++;
            }
            while(right2<version2.length()&&version2.charAt(right2)!='.'){
                right2++;
            }
            String str1=null,str2=null;

            if(right1-left1==0){
                str1="";
            }else{
                str1=version1.substring(left1,right1);
            }
            if(right2-left2==0){
                str2="";
            }else{
                str2=version2.substring(left2,right2);
            }
            

            if(str1.length()>str2.length()){
                str2=addzero(str2,str1.length());
            }else{
                str1=addzero(str1,str2.length());
            }
            
            int res=compare(str1,str2);
            if(res==1||res==-1){
                return res;
            }

            if(right1+1==version1.length()){
                left1=++right1;
            }else{
                left1=(right1++)+1;
            }

            if(right2+1==version2.length()){
                left2=++right2;
            }else{
                left2=(right2++)+1;
            }
        }
        return 0;
    }

    public String addzero(String str,int len){
        while(str.length()<len){
            str='0'+str;
        }
        return str;
    }

    public int compare(String str1,String str2){
        int index=0;
        while(index<str1.length()){
            if(str1.charAt(index)>str2.charAt(index)){
                return 1;
            }
            if(str1.charAt(index)==str2.charAt(index)){
                index++;
                continue; 
            }
            if(str1.charAt(index)<str2.charAt(index)){
                return -1;
            }
        }
        return 0;
    }

}

这个代码写的很差,因为很多点可以优化,对于截取的操作,没想到用spilt(再次狗头)。进行一些优化后的代码:

class Solution {
    public int compareVersion(String version1, String version2) {
        version1=version1+".";
        version2=version2+".";

        int left1=0,right1=0;
        int left2=0,right2=0;

        while(right2<version2.length()||right1<version1.length()){

            while(right1<version1.length()&&version1.charAt(right1)!='.'){
                right1++;
            }
            while(right2<version2.length()&&version2.charAt(right2)!='.'){
                right2++;
            }

            String str1="0",str2="0";
            if(right1-left1!=0){
                str1=version1.substring(left1,right1);
            }

            if(right2-left2!=0){
                str2=version2.substring(left2,right2);
            }

            if(Integer.parseInt(str1)>Integer.parseInt(str2)){
                return 1;
            }else{
                if(Integer.parseInt(str1)<Integer.parseInt(str2)){
                    return -1;
                }
            }

            if(right1+1==version1.length()){
                left1=++right1;
            }else{
                left1=(right1++)+1;
            }

            if(right2+1==version2.length()){
                left2=++right2;
            }else{
                left2=(right2++)+1;
            }
        }
        return 0;
    }
}

解法二:转换成整型比较

思路

先用spilt切割,然后将切割出来的元素转换为整型去比较,省事很多。具体做法是:

  1. 先把两个版本号的修订号切割完放在一个字符串数组v1[ ],v2[ ]中

  1. 开始比较两个数组中的元素(用index来标志比较到了哪个位置):

  1. 如果index小于两个数组的长度,要是v1[index]>v2[index],返回1,=返回0,<返回-1.

  1. 如果index已经大于其中的一个数组了,这时候如果是v1[ ]比较长,那么只要其元素有一个大于0,就返回1,如果是v2[ ]比较长,那么只要其元素有一个大于0,就返回-1,否则返回0.

分割方法

String[] v1=version1.split("\\.");//.前要加\\

数字字符串转换整型方法

Integer.parseInt(str);

代码

class Solution {
    public int compareVersion(String version1, String version2) {
        String[] v1=version1.split("\\.");
        String[] v2=version2.split("\\.");
        int index=0;

        while(index<v1.length&&index<v2.length){
            if(Integer.parseInt(v1[index])>Integer.parseInt(v2[index])){
                return 1;
            }else{
                if(Integer.parseInt(v1[index])<Integer.parseInt(v2[index])){
                    return -1;
                }else{
                    index++;
                }
            }
        }

        while(index<v1.length){
            if(Integer.parseInt(v1[index++])>0){
                return 1;
            }
        }
        
        while(index<v2.length){
            if(Integer.parseInt(v2[index++])>0){
                return -1;
            }
        }
        return 0;
    }
}

代码确实比第一个简洁很多,但是由于第一个方法不需要储存分割后的元素,所以空间复杂度还略显优秀一些。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值