LeetCode: Compare Version Numbers

来源:互联网 发布:淘宝美工常用ps字体 编辑:程序博客网 时间:2024/05/29 03:45

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
class Solution {public:    int compareVersion(string version1, string version2) {        int pos1 = 0, pos2 = 0, pre1 = 0, pre2 = 0;        while(pos1 < version1.size() && pos2 < version2.size())        {            pos1 = version1.find('.', pos1) == std::string::npos ? version1.size() : version1.find('.', pos1);            pos2 = version2.find('.', pos2) == std::string::npos ? version2.size() : version2.find('.', pos2);            int cur = compare(version1.substr(pre1, pos1-pre1), version2.substr(pre2, pos2-pre2));            pos1++;            pos2++;            if(cur == 0)            {                pre1 = pos1;                pre2 = pos2;            }            else                return cur;        }        while(pos1 < version1.size() && (version1[pos1] == '0' || version1[pos1] == '.'))        {            pos1++;        }        while(pos2 < version2.size() && (version2[pos2] == '0' || version2[pos2] == '.' ))        {            pos2++;        }        if(pos1 < version1.size())            return 1;        else if(pos2 < version2.size())            return -1;        else            return 0;    }private:    int compare( string v1,  string v2)    {while(!v1.empty() && v1[0] == '0')        {            v1 = v1.size() > 1 ? v1.substr(1) : "";        }while(!v2.empty() && v2[0] == '0')        {v2 = v2.size() > 1 ? v2.substr(1) : "";        }        int l1 = v1.size();        int l2 = v2.size();        if(l1 == l2)        {            for(int i = 0; i < l1; i++)            {                if(v1[i] == v2[i])                    continue;                else                {                    return v1[i] - v2[i] > 0 ? 1 : -1;                }            }            return 0;        }        else            return l1 > l2 ? 1 : -1;            }};




0 0