Problem
Compare two version numbers version1 and version2.
If version1 > version2 return 1
, if version1 < version2 return -1
, otherwise return 0
.
You may assume that the version strings are non-empty and contain only digits and the . character.
The . character does not represent a decimal point and is used to separate number sequences.
For instance, 2.5 is not "two and a half" or "half way to version three", it is the fifth second-level revision of the second first-level revision.
Here is an example of version numbers ordering:
0.1 < 1.1 < 1.2 < 13.37
Note
看到一个巧妙的解法,分享一下:
将version1
,version2
都转换为char array,然后分别用两个指针s1
, i1
和s2
, i2
展开循环。
首先找整数部分的坐标段,s1
和s2
都指向初值0
,令i1
和i2
一直向后遍历到小数点为止。
然后用Integer.valueOf(someStr.substring(s1, i1))
将version1
, version2
的整数段转化为数值,进行比较:若结果为大于或小于关系,直接返回结果;若结果为相等,进行小数部分的比较。
比较小数大小,只比高位即可,所以可以沿用这个循环,只需要继续用i1
和i2
向后移动,同时赋坐标值给s1
和s2
。这样转化数值函数中的小数段每次遍历就只有一个字符:str.substring(i1, i1)
,即str.charAt(i1)
。
Solution
public class Solution {
public int compareVersion(String version1, String version2) {
char[] v1 = version1.toCharArray();
char[] v2 = version2.toCharArray();
int i1 = 0,i2 = 0;
int s1 = 0,s2 = 0;
while(i1 < v1.length || i2 < v2.length){
while(i1 < v1.length && v1[i1] != '.') i1++;
while(i2 < v2.length && v2[i2] != '.') i2++;
int a = s1 < v1.length ? Integer.valueOf(version1.substring(s1,i1)) : 0;
int b = s2 < v2.length ? Integer.valueOf(version2.substring(s2,i2)) : 0;
if(a > b) return 1;
if(a < b) return -1;
s1 = ++i1;
s2 = ++i2;
}
return 0;
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。