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; } };