[Lc]165比较版本号
Contents
题目
题解
1. stringstream法
用stringstream和getline切割字符串,并挨个比较,本来想用getline的,但是这样while循环不好写,若写出或结构有短路操作,若getline()外面套个bool,while循环是可以写了,但是若两个字符串.的个数不一样又会有新的问题,因此还是乖乖用»
- 时间复杂度$O(max{m,n})$
- 空间复杂度$O(1)$
class Solution {
public:
int compareVersion(string version1, string version2) {
stringstream s1(version1+"."), s2(version2+".");//加个.使字符串更规范,用>>更方便
char dot = '.';//用dot保存'.',注意用char
int val1, val2;
while(s1.good() || s2.good()){
s1>>val1>>dot;
s2>>val2>>dot;
if(val1 < val2) return -1;
else if(val1 > val2) return 1;//进行比较
val1 = val2 =0;
}
return 0;
}
};
2. 双指针法
两个指针挨个后移,取数比较,注意while循环个终止条件和里面两个while地循环终止条件
- 时间复杂度$O(N)$
- 空间复杂度$O(1)$
class Solution {
public:
int compareVersion(string version1, string version2) {
int p1 = 0, p2 = 0;//双指针
int n = max(version1.size(), version2.size());//取两个里面长的作为总遍历长度
while(p1<n || p2<n){//有一个没超过end就继续遍历
int val1 = 0, val2 = 0;//暂存当前值
while(p1<version1.size() && version1[p1]!='.'){
val1 = val1*10 + version1[p1++]-'0';
}//取当前值,到'.'停,挨个取数并×10再加在一起
while(p2<version2.size() && version2[p2]!='.'){
val2 = val2*10 + version2[p2++]-'0';
}//同上
if(val1 > val2) return 1;
else if(val1 < val2) return -1;//进行比较
p1++;
p2++;//两个指针后移,此时两个可能在末尾或者在'.'处
}
return 0;
}
};
Author ChrisHRZ
LastMod 2020-05-07