题目描述
比较“版本号”大小,给定的版本号version1和version2是字符串类型的,字符串只包含数字和小数点,当version1>version2的时候,返回1,当version1<version2时返回-1,相等时返回0。
样例
输入:"1.2.3.4", "1.3"
输出:-1
解释:注意这里的版本号内的小数点和数字中的小数点的意思不一样,这里只是用来分隔数字。由于"1.3"中的第二位3比"1.2.3.4"中的第二位2要大,因此version2>version1,返回-1.
算法
(单纯的字符串操作) $O(n)$
这道题其实是单纯的字符串操作题,但是通过率只有20%说明有许多细节需要注意。思想很简单,就是用两个指针分别指向两个字符串向后遍历,找到小数点就停下来,把字符串每个小数点分隔开的数字解析出来进行比较,数字越在前面优先级越高。注意有些容易漏掉的细节,例如当一个字符串结束了,但另一个字符串没有结束,那么结束了的字符串之后的数字就一直是0。
C++ 代码
class Solution {
public:
int compareVersion(string version1, string version2) {
int p1 = 0, p2 = 0;
int num1 = 0, num2 = 0;
while(p1 < version1.size() || p2 < version2.size()){
while(p1<version1.size()&&version1[p1]!='.'){//解析两个小数点之间的数字
num1 = num1*10+version1[p1]-'0';
p1++;
}
while(p2<version2.size()&&version2[p2]!='.'){
num2 = num2*10 + version2[p2] - '0';
p2++;
}
if(num1>num2)
return 1;
if(num1<num2)
return -1;
num1 = 0;//注意这里要置0
num2 = 0;
p1++;
p2++;
}
return 0;
}
};
int num 要改成long long num
int num1 = 0, num2 = 0; 把这行放在while里面就不用“注意这里要置0”了
大佬,你题目描述里面“当version1>version2的时候,返回1,当version2<version1时返回-1”,写错了,都是一个意思
好的,已修改