問題:
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
大意:
比較兩個版本號 version1 和 version2。
如果 version1 > version2 就返回 ,如果 version1 < version2 就返回 -1,否則返回0。
你可以假設(shè)版本字符串是非空的而且只包含數(shù)字和 “.” 字符。
“.”字符不表示小數(shù)點,是用來區(qū)分數(shù)字序號的。
比如說,2.5不是指超過2一半或者還有一半到版本3,而是第二個版本的第五次迭代。
這里是一個版本號順序的例子:0.1 < 1.1 < 1.2 < 13.37
思路:
比較版本號實在系統(tǒng)開發(fā)中經(jīng)常用到的東西,題目中的例子給的其實有點不靠譜,版本號真正特殊的地方在于會存在多個小數(shù)點,也就是會有 1.3.2 這種版本號存在,真正要判斷大小的也是這類版本。
我們首先把兩個版本號字符串用 split 函數(shù)根據(jù)小數(shù)點分割成數(shù)組,注意要根據(jù)小數(shù)點區(qū)分不能直接只寫小數(shù)點,還要用轉(zhuǎn)義符,否則無法分割,具體看下面的代碼。
然后依次比較每位數(shù)字的大小,只要出現(xiàn)同一個位置上某一方更大,就可以直接返回結(jié)果了。需要注意的是不能直接比較字符串,需要轉(zhuǎn)成int去比較,因為題目會給出“000”這種多個0的情況,字符串直接比較不了,轉(zhuǎn)成int后就都是0了。
當某個版本號的數(shù)字全部比較完后,看看另一個版本號還有沒有內(nèi)容,有的話也不能急著判斷是另一個大,因為存在 1.0 這種情況,它和 1 是一樣大的,就是多一位0,那是不是只用判斷下一位是不是0呢,也不是,還有 1.0.1 的情況,它就比 1 大。所以,當某個版本號還有剩余的時候,我們要看看剩余的部分有沒有不是0的部分,這里同樣必須轉(zhuǎn)成int去和0比較,字符串無法全部囊括。
自己測試下面幾個用例就差不多了:
- 1.1 和 1.2
- 1 和 1.0
- 1 和 1.0.1
- 1.00.0 和 1.0
- 1 和 1.00
代碼(Java):
public class Solution {
public int compareVersion(String version1, String version2) {
String[] arr1 = version1.split("\\.");
String[] arr2 = version2.split("\\.");
// System.out.println(arr1.length + " " + arr2.length);
int i = 0;
while (i < arr1.length && i < arr2.length) {
// System.out.println(arr1[i] + " " + arr2[i]);
int a = Integer.valueOf(arr1[i]).intValue();
int b = Integer.valueOf(arr2[i]).intValue();
if (a > b) return 1;
else if (a < b) return -1;
i++;
}
if (i < arr1.length) {
while (i < arr1.length) {
int version = Integer.valueOf(arr1[i]).intValue();
if (version != 0) return 1;
i++;
}
return 0;
}
else if ( i < arr2.length) {
while (i < arr2.length) {
int version = Integer.valueOf(arr2[i]).intValue();
if (version != 0) return -1;
i++;
}
return 0;
}
else return 0;
}
}
合集:https://github.com/Cloudox/LeetCode-Record