問(wèn)題:
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
大意:
比較兩個(gè)版本號(hào) version1 和 version2火本。
如果 version1 > version2 就返回 ,如果 version1 < version2 就返回 -1,否則返回0娩缰。
你可以假設(shè)版本字符串是非空的而且只包含數(shù)字和 “.” 字符敷扫。
“.”字符不表示小數(shù)點(diǎn)突诬,是用來(lái)區(qū)分?jǐn)?shù)字序號(hào)的漫雷。
比如說(shuō)颂龙,2.5不是指超過(guò)2一半或者還有一半到版本3习蓬,而是第二個(gè)版本的第五次迭代。
這里是一個(gè)版本號(hào)順序的例子:0.1 < 1.1 < 1.2 < 13.37
思路:
比較版本號(hào)實(shí)在系統(tǒng)開發(fā)中經(jīng)常用到的東西措嵌,題目中的例子給的其實(shí)有點(diǎn)不靠譜躲叼,版本號(hào)真正特殊的地方在于會(huì)存在多個(gè)小數(shù)點(diǎn),也就是會(huì)有 1.3.2 這種版本號(hào)存在企巢,真正要判斷大小的也是這類版本枫慷。
我們首先把兩個(gè)版本號(hào)字符串用 split 函數(shù)根據(jù)小數(shù)點(diǎn)分割成數(shù)組,注意要根據(jù)小數(shù)點(diǎn)區(qū)分不能直接只寫小數(shù)點(diǎn)浪规,還要用轉(zhuǎn)義符或听,否則無(wú)法分割,具體看下面的代碼笋婿。
然后依次比較每位數(shù)字的大小誉裆,只要出現(xiàn)同一個(gè)位置上某一方更大,就可以直接返回結(jié)果了缸濒。需要注意的是不能直接比較字符串足丢,需要轉(zhuǎn)成int去比較,因?yàn)轭}目會(huì)給出“000”這種多個(gè)0的情況庇配,字符串直接比較不了霎桅,轉(zhuǎn)成int后就都是0了。
當(dāng)某個(gè)版本號(hào)的數(shù)字全部比較完后讨永,看看另一個(gè)版本號(hào)還有沒有內(nèi)容,有的話也不能急著判斷是另一個(gè)大遇革,因?yàn)榇嬖?1.0 這種情況卿闹,它和 1 是一樣大的,就是多一位0萝快,那是不是只用判斷下一位是不是0呢锻霎,也不是,還有 1.0.1 的情況揪漩,它就比 1 大旋恼。所以,當(dāng)某個(gè)版本號(hào)還有剩余的時(shí)候奄容,我們要看看剩余的部分有沒有不是0的部分冰更,這里同樣必須轉(zhuǎn)成int去和0比較产徊,字符串無(wú)法全部囊括。
自己測(cè)試下面幾個(gè)用例就差不多了:
- 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