leetcode: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,值得注意的是.并不是代表小数点,例如: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; } };
朱颜辞镜花辞树,敏捷开发靠得住!