標籤:
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,值得注意的是.並不是代表小數點,例如:2.5表示第二個一級第五個二級版本
思路:可以進行逐位比較,把字串轉化成整型。
注意考慮test case:0.1 與 0.01 結果是:0.1>0.01
代碼如下:
class Solution { public: int compareVersion(string version1, string version2) { int v1, v2; int t1 = 0, t2 = 0; while (t1 < version1.length() || t2 < version2.length()) { v1 = 0; while (t1 < version1.length()) { if (version1[t1] == ‘.‘) { ++t1; break; } v1 = v1 * 10 + (version1[t1] - ‘0‘); ++t1; } v2 = 0; while (t2 < version2.length()) { if (version2[t2] == ‘.‘) { ++t2; break; } v2 = v2 * 10 + (version2[t2] - ‘0‘); ++t2; } if (v1 > v2) return 1; if (v1 < v2) return -1; } return 0; } };
其他解法:
class Solution { public: int compareVersion(string version1, string version2) { const char *p1 = version1.c_str()-1; const char *p2 = version2.c_str()-1; do{ int v1 = 0, v2 =0; if (p1){ v1=atoi(p1+1); p1 = strchr(p1+1, ‘.‘); } if (p2){ v2=atoi(p2+1); p2 = strchr(p2+1, ‘.‘); } if (v1<v2) return -1; if (v2<v1) return 1; }while(p1||p2); return 0; } };
或:
class Solution {public: int compareVersion(string version1, string version2) { int n = version1.size(), m = version2.size(); for (int i = 0, j = 0; i < n || j < m; i++, j++) { size_t p = 0; int a = ((i >= n) ? 0 : stoi(version1.substr(i), &p)); i += p; int b = ((j >= m) ? 0 : stoi(version2.substr(j), &p)); j += p; if (a > b) return 1; if (a < b) return -1; } return 0; }};
或:
class Solution { public:int compareVersion(string version1, string version2) { istringstream iss1(version1), iss2(version2); string token1, token2; while(!iss1.eof() || !iss2.eof()) { getline(iss1, token1, ‘.‘); getline(iss2, token2, ‘.‘); if(stoi(token1) > stoi(token2)) return 1; if(stoi(token1) < stoi(token2)) return -1; token1 = token2 = "0"; } return 0;}};
leetcode:Compare Version Numbers