这道题是要我们比较两个版本号(就是那些软件的版本号)的大小。一开始我还奇怪这道题很简单怎么通过率这么低(17.7%)。做完之后我就知道我还是太年轻了= =
一开始我是直接用atof函数把string转成double进行比较,然后就死在1.1和1.10的比较上了,很明显1.10>1.1 但转成double之后就会有1.1 = 1.1…
于是我改成以‘.’为界,前面用一个int记录,后面用另一个int记录。然后比较。然后死在1.1.1 和1.1的比较上。哦买尬,居然还有更低的….
ps:这里用的转换函数是atoi。
然后我觉得用数组来记录版本号,那就无所谓有几个‘.’了。从前到后进行大小比较,如果当一个的数组比完了还没分出大小,那就看谁的数组长,更长的那个就更大。当我信心满满的提交时——1.1.0 和1.1的比较又出错了。纳尼?1.1.0是什么鬼? 我的代码判断1.1.0大于1.1,因为前面是一样的,但1.1.0的数组会比1.1的多一位,所以1.1.0>1.1,但其实应该是1.1.0 = 1.1.
所以我又改进了最后数组比长短那里,如果一个更长,还不能做判断,必须有多出来的数字不全为0才算数。这样终于AC了…
AC代码:
int compareVersion(string version1, string version2) {
string a[1000],b[1000];
int atemp = 0;
for(int i = 0; i<version1.size();i++){
if(version1[i]!='.')
a[atemp]+=version1[i];
else if(version1[i] == '.'){
atemp++;
}
}
int btemp = 0;
for(int i = 0; i<version2.size();i++){
if(version2[i]!='.')
b[btemp]+=version2[i];
else if(version2[i] == '.'){
btemp++;
}
}
int a_int[1000],b_int[1000];
for(int i = 0;i < atemp+1;i++){
a_int[i] = atoi(a[i].c_str());
}
for(int i = 0;i < btemp+1;i++){
b_int[i] = atoi(b[i].c_str());
}
int len = atemp<btemp?atemp:btemp;
for(int i =0;i < len+1;i++){
if(a_int[i]>b_int[i])
return 1;
else if(a_int[i]<b_int[i])
return -1;
else
continue;
}
if(atemp == btemp)
return 0;
else if(atemp>btemp){
for(int i = btemp+1;i<atemp+1;i++){
if(a_int[i] != 0)
return 1;
}
return 0;
}
else{
for(int i = atemp+1;i<btemp+1;i++){
if(b_int[i] != 0)
return -1;
}
return 0;
}
}
顺便因为这道题学习了string转int的问题,我也写了一个博客:http://blog.csdn.net/Trident_/article/details/51569412