LeetCode筆記:165. Compare Version Numbers

問題:

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


查看作者首頁

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容