Leetcode: Compare Version Numbers

来源:互联网 发布:金承志 知乎 编辑:程序博客网 时间:2024/04/23 18:00


Compare two version numbers version1 and version1.
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) {        if (version1 == version2) {            return 0;        }                string ver1, ver2;        size_t start1 = 0;        size_t start2 = 0;        size_t pos1 = version1.find('.', start1);        size_t pos2 = version2.find('.', start2);        while (pos1 != string::npos && pos2 != string::npos) {            ver1 = version1.substr(start1, pos1 - start1);            ver2 = version2.substr(start2, pos2 - start2);            int result = cmpVer(ver1, ver2);            if (result != 0) {                return result;            }                        start1 = pos1 + 1;            start2 = pos2 + 1;            pos1 = version1.find('.', start1);            pos2 = version2.find('.', start2);        }                string remaining;        if (pos1 == string::npos) {            ver1 = version1.substr(start1);        }        else {            ver1 = version1.substr(start1, pos1 - start1);            remaining = version1.substr(pos1 + 1);        }        if (pos2 == string::npos) {            ver2 = version2.substr(start2);        }        else {            ver2 = version2.substr(start2, pos2 - start2);            remaining = version2.substr(pos2 + 1);        }        int result = cmpVer(ver1, ver2);        if (result != 0) {            return result;        }                bool allZero = true;        for (int i = 0; i < remaining.size(); ++i) {            if (remaining[i] != '0' && remaining[i] != '.') {                allZero = false;                break;            }        }        if (allZero) {            return 0;        }                return pos1 == string::npos ? -1 : 1;    }        void trimLeadingZero(string& ver) {        size_t i;        for (i = 0; i < ver.size(); ++i) {            if (ver[i] != '0') {                break;            }        }        if (i > 0) {            ver = ver.substr(i);        }    }        int cmpVer(string& ver1, string& ver2) {        trimLeadingZero(ver1);        trimLeadingZero(ver2);        if (ver1.size() > ver2.size()) {            return 1;        } else if (ver1.size() < ver2.size()) {            return -1;        }        else {            if (ver1 == ver2) {                return 0;            }            else {                return ver1 > ver2 ? 1 : -1;            }        }    }};
试了一下Boost的split功能,结果Boost不能用。

0 0
原创粉丝点击