165. 比较版本号 - 力扣(LeetCode)
需要按照 .
进行分割,c++里面分割最方便的就是使用stringstream了,可以首先将两个字符串的.
的数量增加到一致(补0就可以了):
class Solution {
public:
int compareVersion(string version1, string version2) {
int cnt1 = count(version1.begin(), version1.end(), '.');
int cnt2 = count(version2.begin(), version2.end(), '.');
cout << cnt1 << " " << cnt2 << endl;
while(cnt1 < cnt2){
--cnt2;
version1 += ".0";
}
while(cnt1 > cnt2){
--cnt1;
version2 += ".0";
}
stringstream ss1(version1), ss2(version2);
string s1, s2;
while(getline(ss1, s1, '.') && getline(ss2, s2, '.')){
if(stoi(s1) > stoi(s2)) return 1;
else if(stoi(s1) < stoi(s2)) return -1;
}
return 0;
}
};
题解看到的另一种写法:
class Solution {
public:
int compareVersion(string version1, string version2) {
stringstream ss1(version1), ss2(version2);
int num1, num2;//提取数字
char c;//提取'.'
while(ss1.good() || ss2.good()){
ss1 >> num1;
ss2 >> num2;
cout << num1 << " " << num2 << endl;
if(num1 > num2) return 1;
else if(num1 < num2) return -1;
num1 = 0;//置为0不影响后续的比较
num2 = 0;
ss1 >> c;//跳过'.'
ss2 >> c;
}
return 0;
}
};
双指针的思路:
class Solution {
public:
int compareVersion(string version1, string version2) {
int i = 0, j = 0, end = max(version1.size(), version2.size());
while(i < end || j < end){
int v1 = 0, v2 = 0;
while(i < version1.size() && version1[i] != '.')
v1 = 10*v1 + (version1[i++] - '0');
while(j < version2.size() && version2[j] != '.')
v2 = 10*v2 + (version2[j++] - '0');
if(v1 > v2) return 1;
if(v1 < v2) return -1;
++i; ++j;
}
return 0;
}
};