题解 | #比较版本号#

比较版本号

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

思路:

正常截取字符串,然后比较字符串数组中的每个数字;如果数字存在以0开头的,则截取子串即可,转换为整数比较大小
如果存在数组长短不一样,则短的数组直接用字符"0"代替。
思路简单易理解

/**
     * 时间 复杂度为n
     * 
     * 就正常分割字符串,然后比较字符串数组中,每一个数字的大小,如果是以0开头,则截取字符串
     * 
     * 
     * @param version1
     * @param version2
     * @return
     */
    public  static int compare (String version1, String version2) {

        String[] array1 = version1.split("\\.");
        String[] array2 = version2.split("\\.");

        int len1 = array1.length;
        int len2 = array2.length;

        int index = 0;
        for (; index < Math.min(len1, len2); index++) {
            int ret = compareSignal(array1[index], array2[index]);
            if (ret != 0) {
                return ret;
            }
        }
        if (len1 > len2){
            for (;index < len1; index++){
                int ret = compareSignal(array1[index], "0");
                if (ret !=0) {
                    return ret;
                }
            }
        } else {
            for (;index < len2; index++){
                int ret = compareSignal("0", array2[index]);
                if (ret !=0) {
                    return ret;
                }
            }
        }
        return  0;
    }

    /**
     * 比较字符串数组中的每个字符串,将字符串转换为整数比较即可
     * 
     * @param str1
     * @param str2
     * @return
     */
    private static int compareSignal(String str1, String str2){
        int v1 = Integer.parseInt(str1.substring(getIndex(str1)));
        int v2 = Integer.parseInt(str2.substring(getIndex(str2)));
        if (v1 == v2) return 0;
        return v1 > v2  ? 1 : -1;
    }

    /**
     * 如果字符串以0开头,则截取字符串,直到不为0开始,返回这个索引,用于截取后面的数字
     * 
     * 如果所有数字都是0,则返回0即可。
     * 
     * @param str
     * @return
     */
    private static int getIndex(String str){
        int index = 0;
        if  (str.startsWith("0")){
            for (char ch : str.toCharArray()){
                if (ch == '0') {
                    index++;
                } else {
                    break;
                }
            }
        }
        if (index >= str.length()) {
            return 0;
        }
        return index;
    }
我的刷题题解 文章被收录于专栏

自己在刷题过程中的一些思路和见解记录

全部评论

相关推荐

accaacc:2到4k,不是2k到4k,所以年薪是30块
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务