比较两个版本号 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;
}
}