1. 程式人生 > 實用技巧 >LeetCode165. 比較版本號

LeetCode165. 比較版本號

根據題意,用'.'劃分出兩個版本的每個子版本號,從左到右逐個比較即可,如果某個版本的子版本號個數比另一個多,則子版本較少的那個版本用0表示子版本,這樣就可以一直比較兩個版本的所有子版本了。

劃分子版本可以用雙指標,劃分出的子版本存到一個數組中,都劃分好後就得到兩個分別存放兩個版本的子版本的陣列,然後對陣列逐個進行比較,如果相等就往後,否則返回結果。

如果某個陣列大於另一個數組,則較小的另一個數組剩下的部分用0和較大的陣列的當前元素比較(表示剩下的子版本都是0),一直比較下去直到比較出大小或者兩個陣列都結束了,都結束了就返回0,說明兩個版本號是相同的。

程式碼如下:

class Solution {
public:
    int compareVersion(string version1, string version2) {
        vector<int> v1, v2;
        int i = 0;
        for(; i < version1.size(); ++i) {
            int j = i;
            while(j < version1.size() && version1[j] != '.') {            //雙指標劃分出子版本號,存放到陣列v1中
                ++j;
            }
            string subVer = version1.substr(i, j - i);
            v1.push_back(atoi(subVer.c_str()));
            i = j;
        }
        for(i = 0; i <version2.size(); ++i) {
            int j = i;
            while(j < version2.size() && version2[j] != '.') {
                ++j;
            }
            string subVer = version2.substr(i, j - i);
            v2.push_back(atoi(subVer.c_str()));
            i = j;
        }
        for(int i = 0; i < min(v1.size(), v2.size()); ++i) {
            if(v1[i] > v2[i]) {
                return 1;
            } else if(v1[i] < v2[i]) {
                return -1;
            }
        }
        if(v1.size() < v2.size()) {
            for(int i = v1.size(); i < v2.size(); ++i) {
                if(0 < v2[i]) {                              //如果v1的大小小於v2的大小,則v1不足的部分用0和v2[i]比較,表示後面的子版本號都是0
                    return -1;
                }
            }
        }
        if(v1.size() > v2.size()) {
            for(int i = v2.size(); i < v1.size(); ++i) {
                if(v1[i] > 0) {
                    return 1;
                }
            }
        }
        return 0;
    }
};