题目
[compare-version-numbers](https://leetcode.com/problems/compare-version-numbers/)
算法
* 直接模拟
* stringstream
* strtol
代码
* 直接模拟
class Solution {
private:
// get number from ver[pos] into num
void getNum(const string &version, int &len, int &pos, int &num) {
num = 0;
while (pos < len && version[pos] != '.') {
num = num * 10 + version[pos] - '0';
pos++;
}
pos++;
}
public:
int compareVersion(string version1, string version2) {
int len1 = version1.length();
int len2 = version2.length();
int curPos1 = 0, curPos2 = 0;
int num1, num2;
while (curPos1 < len1 || curPos2 < len2) {
getNum(version1, len1, curPos1, num1);
getNum(version2, len2, curPos2, num2);
if (num1 > num2)
return 1;
if (num1 < num2)
return -1;
}
return 0;
}
};
* streamstring
class Solution {
public:
int compareVersion(string version1, string version2) {
istringstream v1(version1 + "."), v2(version2 + ".");
int d1 = 0, d2 = 0;
char dot = '.';
while (v1.good() || v2.good()) {
if (v1.good()) v1 >> d1 >> dot;
if (v2.good()) v2 >> d2 >> dot;
if (d1 > d2) return 1;
else if (d1 < d2) return -1;
d1 = d2 = 0;
}
return 0;
}
};
* strtol
class Solution {
public:
int compareVersion(string version1, string version2) {
int res = 0;
char *v1 = (char*)version1.c_str(), *v2 = (char*)version2.c_str();
while (res == 0 && (*v1 != '\0' || *v2 != '\0')) {
long d1 = *v1 == '\0' ? 0 : strtol(v1, &v1, 10);
long d2 = *v2 == '\0' ? 0 : strtol(v2, &v2, 10);
if (d1 > d2) return 1;
else if (d1 < d2) return -1;
else {
if (*v1 != '\0') ++v1;
if (*v2 != '\0') ++v2;
}
}
return res;
}
};