165. 比较版本号 挺好的一道题
比较两个版本号 version1 和 version2。如果 *version1* > *version2*
返回 1
,如果 *version1* < *version2*
返回 -1
, 除此之外返回 0
。
你可以假设版本字符串非空,并且只包含数字和 .
字符。
.
字符不代表小数点,而是用于分隔数字序列。
例如,2.5
不是“两个半”,也不是“差一半到三”,而是第二版中的第五个小版本。
你可以假设版本号的每一级的默认修订版号为 0
。例如,版本号 3.4
的第一级(大版本)和第二级(小版本)修订号分别为 3
和 4
。其第三级和第四级修订号均为 0
。
示例 1:
输入: version1 = "0.1", version2 = "1.1"
输出: -1
示例 2:
输入: version1 = "1.0.1", version2 = "1"
输出: 1
示例 3:
输入: version1 = "7.5.2.4", version2 = "7.5.3"
输出: -1
示例 4:
输入:version1 = "1.01", version2 = "1.001"
输出:0
解释:忽略前导零,“01” 和 “001” 表示相同的数字 “1”。
示例 5:
输入:version1 = "1.0", version2 = "1.0.0"
输出:0
解释:version1 没有第三级修订号,这意味着它的第三级修订号默认为 “0”。
提示:
- 版本字符串由以点 (
.
) 分隔的数字字符串组成。这个数字字符串可能有前导零。 - 版本字符串不以点开始或结束,并且其中不会有两个连续的点。
1、双指针,不过int会溢出
"19.8.3.17.5.01.0.0.4.0.0.0.0.0.0.0.0.0.0.0.0.0.00.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.000000.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.000000"
"19.8.3.17.5.01.0.0.4.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0000.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.000000"
intcompareVersion(stringversion1, stringversion2) {
intsum1=0, sum2=0;
intlen1=version1.size(),len2=version2.size();
intindex1=0,index2=0;
while(index1<len1||index2<len2){
inttemp=0;
while(index1<len1 &&version1[index1] !='.'){
//if(version1[index1] ==0 && temp == 0) index1++;
//if(version1[index1] ==0 && temp != 0) temp = temp*10;
if(version1[index1] ==0) temp=temp*10;
// if(version1[index1] !=0 && temp != 0) temp = temp*10 + version1[index1]-'0';
//if(version1[index1] !=0 && temp == 0) temp = version1[index1] - '0';
if(version1[index1] !=0) temp=temp*10+version1[index1]-'0';
index1++;
}
sum1=sum1*10+temp;
temp=0;
while(index2<len2 &&version2[index2] !='.'){
//if(version1[index1] ==0 && temp == 0) index1++;
//if(version1[index1] ==0 && temp != 0) temp = temp*10;
if(version2[index2] ==0) temp=temp*10;
// if(version1[index1] !=0 && temp != 0) temp = temp*10 + version1[index1]-'0';
//if(version1[index1] !=0 && temp == 0) temp = version1[index1] - '0';
if(version2[index2] !=0) temp=temp*10+version2[index2]-'0';
index2++;
}
sum2=sum2*10+temp;
//cout<<sum1<<" "<<sum2<<endl;
index1++;
index2++;
if(sum1>sum2) return1;
if(sum1<sum2) return-1;
}
return0;
}
2、改进一下,其实每次比较完毕,如果一样就可以置0,再继续比较下去了
执行用时:0 ms, 在所有 C++ 提交中击败了100.00%的用户
内存消耗:6.2 MB, 在所有 C++ 提交中击败了100.00%的用户
intcompareVersion(stringversion1, stringversion2) {
intsum1=0, sum2=0;
intlen1=version1.size(), len2=version2.size();
intindex1=0, index2=0;
while (index1<len1||index2<len2) {
inttemp=0;
while (index1<len1&&version1[index1] !='.') {
//if(version1[index1] ==0 && temp == 0) index1++;
//if(version1[index1] ==0 && temp != 0) temp = temp*10;
if (version1[index1] ==0) temp=temp*10;
// if(version1[index1] !=0 && temp != 0) temp = temp*10 + version1[index1]-'0';
//if(version1[index1] !=0 && temp == 0) temp = version1[index1] - '0';
if (version1[index1] !=0) temp=temp*10+version1[index1] -'0';
index1++;
}
sum1=sum1*10+temp;
temp=0;
while (index2<len2&&version2[index2] !='.') {
//if(version1[index1] ==0 && temp == 0) index1++;
//if(version1[index1] ==0 && temp != 0) temp = temp*10;
if (version2[index2] ==0) temp=temp*10;
// if(version1[index1] !=0 && temp != 0) temp = temp*10 + version1[index1]-'0';
//if(version1[index1] !=0 && temp == 0) temp = version1[index1] - '0';
if (version2[index2] !=0) temp=temp*10+version2[index2] -'0';
index2++;
}
sum2=sum2*10+temp;
cout<<sum1<<" "<<sum2<<endl;
index1++;
index2++;
if (sum1>sum2) return1;
if (sum1<sum2) return-1;
sum1=0;//这是关键
sum2=0;
}
return0;
}
3、精简代码
执行用时:0 ms, 在所有 C++ 提交中击败了100.00%的用户
内存消耗:6.3 MB, 在所有 C++ 提交中击败了100.00%的用户
intcompareVersion(stringversion1, stringversion2) {
intsum1=0, sum2=0;
intlen1=version1.size(), len2=version2.size();
intindex1=0, index2=0;
while (index1<len1||index2<len2) {
sum1=0;
sum2=0;
while (index1<len1&&version1[index1] !='.') {
sum1=sum1*10+version1[index1] -'0';
index1++;
}
while (index2<len2&&version2[index2] !='.') {
sum2=sum2*10+version2[index2] -'0';
index2++;
}
index1++;
index2++;
//cout << sum1 << " " << sum2 << endl;
if (sum1>sum2) return1;
if (sum1<sum2) return-1;
}
return0;
}