165 Compare Version Numbers 比较版本号

比较两个版本号 version1 和 version2。
如果 version1 大于 version2 返回 1,如果 version1 小于 version2 返回 -1, 除此以外 返回 0。
您可能认为版本字符串非空,并且只包含数字和 . 字符。
这个 . 字符不代表小数点,而是用于分隔数字序列。
例如,2.5 不是“两个半”或“差一半到三个版本”,它是第二个第一级修订版本的第五个二级修订版本。
以下是版本号排序的示例:
0.1 < 1.1 < 1.2 < 13.37

详见:https://leetcode.com/problems/compare-version-numbers/description/

Java实现:

由于两个版本号所含的小数点个数不同,有可能是1和1.1.1比较,还有可能开头有无效0,比如01和1就是相同版本,还有可能末尾无效0,
比如1.0和1也是同一版本。对于没有小数点的数字,可以默认为最后一位是小数点,而版本号比较的核心思想是相同位置的数字比较,
比如题目给的例子:1.2和13.37比较,首先1和13比较,13比1大,所以后面的不用再比了,再比如1.1和1.2比较,前面都是1,则比较小数点后面的数字。
那么算法就是每次对应取出相同位置的小数点之前所有的字符,把他们转为数字比较,若不同则可直接得到答案,若相同,再对应往下取。
如果一个数字已经没有小数点了,则默认取出为0,和另一个比较,这样也解决了末尾无效0的情况。

class Solution {
    public int compareVersion(String version1, String version2) {
        int val1=0,val2=0;
        int idx1=0,idx2=0;
        while(idx1<version1.length()||idx2<version2.length()){
            val1=0;
            while(idx1<version1.length()){
                if(version1.charAt(idx1)=='.'){
                    ++idx1;
                    break;
                }
                val1=val1*10+version1.charAt(idx1++)-'0';
            }
            val2=0;
            while(idx2<version2.length()){
                if(version2.charAt(idx2)=='.'){
                    ++idx2;
                    break;
                }
                val2=val2*10+version2.charAt(idx2++)-'0';
            }
            if(val1>val2){
                return 1;
            }
            else if(val1<val2){
                return -1;
            }
        }
        return 0;
    }
}

参考:https://www.cnblogs.com/grandyang/p/4244123.html

原文地址:https://www.cnblogs.com/xidian2014/p/8728470.html