题解 | #比较版本号大小(非最优解)#

比较版本号

http://www.nowcoder.com/practice/2b317e02f14247a49ffdbdba315459e7

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 比较版本号
     * @param version1 string字符串 
     * @param version2 string字符串 
     * @return int整型
     */
    public int compare (String version1, String version2) {
        //先将版本字符串按照 “.”分割
        String[] arr1 = version1.split("\\.") ;
        String[] arr2 = version2.split("\\.") ;
        int i = 0 ;
        int j = 0 ;
        //然后逐一比较每一段的大小
        while(i < arr1.length && j < arr2.length) {
            if(cmpStrNum(arr1[i],arr2[j]) > 0) {
                return 1 ;
            } else if(cmpStrNum(arr1[i],arr2[j]) < 0) {
                return -1 ;
            }
            i++ ;
            j++ ;
        }
        
        if(i == arr1.length && j == arr2.length) {
            return 0 ;
        } else if(i == arr1.length) {//注意:有可能某一方的后续修订号全是0,因此需要继续判断
            while(j < arr2.length) {
                if(!isZeroStr(arr2[j])) {
                    return -1 ;  
                }
                j++ ;
            }
            return 0 ;
        } else {
            while(i < arr1.length) {
                if(!isZeroStr(arr1[i])) {
                    return 1 ;  
                }
                i++ ;
            }
            return 0 ;
        }
        
    }
    //比较两个字符串代表的数字的 大小  
    //s1>s2返回1 ;s1 < s2返回-1 ;s1=s2返回0
    public int cmpStrNum(String s1 , String s2) {
        char[] a1 = s1.toCharArray() ;
        char[] a2 = s2.toCharArray() ;
        //分别去除s1,s2的前导零
        int i1 = 0 ;
        while(i1 < a1.length && a1[i1] == '0') {
            i1 ++ ;
        }
        int i2 = 0 ;
        while(i2 < a2.length && a2[i2] == '0') {
            i2 ++ ;
        }
        //若存在两串或某一个串全为0则可以直接比较出大小
        if(i1 == a1.length && i2 == a2.length) {
            return 0 ;
        } else if (i1 == a1.length) {
            return -1 ;
        } else if(i2 == a2.length) {
            return 1 ;
        } else {//有效数字的起点
            //先比较长度(长的肯定大)0,1,2,3
            if(a1.length-i1 > a2.length-i2) {
                return 1 ;
            } else if(a1.length-i1 > a2.length-i2) {
                return -1 ;
            } else {
                 //长度一样再逐位比较
                while(i1 < a1.length && i2 < a2.length) {
                    if(a1[i1] > a2[i2]) {
                        return 1 ;
                    } else if(a1[i1] < a2[i2]) {
                        return -1 ;
                    }
                    i1++ ;
                    i2++ ;
                }
                return 0 ;
            }
        }
        
    }
    //判断是不是 “零串”
    public boolean isZeroStr(String str) {
        for(int i = 0 ; i < str.length() ; i ++) {
            if(str.charAt(i) != '0') {
                return false ;
            }
        }
        return true ;
    }
}

一个菜鸟的算法刷题记录 文章被收录于专栏

分享一个菜鸟的成长记录

全部评论

相关推荐

不愿透露姓名的神秘牛友
02-12 18:14
RT,这周五就是情人节了,前女友给我发了消息,我该不该回?
Yoswell:原则上来说让她滚,但是本着工作很累下班想吃瓜的心态,我觉得你可以回一下
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
2024-12-30 18:02
程序员牛肉:1.可以标记一下自己的学校是985,有一些hr可能没想到你这个院校是985的。 2.简历所呈现出来的能力还是有点差的,苍穹外卖+黑马点评。这在java技术域里面也就是刚学三四个月的样子,大厂现在招人少,小厂又更加希望你能直接过来干活。就你简历上呈现出来的能力,确实是有点难找,肉眼可见的不懂技术。 第一个项目中:简单的使用redis也算是亮点嘛?使用jwt,threadlocal也算是亮点?你不就是调了几个包嘛?Nginx作为服务器也能写出来,这不是前端的活嘛? 第二个项目中:分布式锁+mq消息队列+Lua队列。真没啥好问的。属于面试官看一眼就阳痿的简历,没有任何想提问的欲望。 我给你建议是好好的挖一挖这个项目吧,其实苍穹外卖和黑马点评这两个项目很不错了,只不过是太烂大街了导致面试官没啥问的兴趣,所以不太推荐写简历上。
点赞 评论 收藏
分享
coffrar:全都是已读😅沟通一千五百多个了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务