您的位置:首页 > 其它

字符串反转的几种算法

2011-03-28 11:00 218 查看
编写反转字符串的程序,要求优化速度、优化空间

(1)第一次看到这个题目首先想到遍历这个字符串,把第一个和最后一个字符交换,第二个和倒数第二个交换,

依次循环即可,下面时代码

char* strrev1(const char* str)
{
int len = strlen(str);
char* tmp = new char[len + 1];
strcpy(tmp,str);
for (int i = 0; i < len/2; ++i)
{
char c = tmp[i];
tmp[i] = tmp[len – i - 1];
tmp[len – i - 1] = c;
}
return tmp;
}


(2)用数组下标的方式访问数组,实际上用指针直接操作即可

char * strrev(const char *str)
{
int len=srlen(str);
char *temp=new char[len+1];
strcpy(temp,str);
char *p1,*p2;
p1=temp;
p2=temp+len-1;
while(p1<p2)
{
char c=*p1;
*p1++=*p2;
*p2--=c;
}
return temp;
}



然上面的两个解法中没有考虑时间和空间的优化,一个典型的优化策略就是两个字符交换的算法优化,我们可以完全不使用任何外部变量即完成两个字符(或者整
数)的交换,这也是一个很经典的面试题目。特别是一些嵌入式硬件相关编程中经常要考虑寄存器的使用,因此经常有不使用任何第三个寄存器即完成两个寄存器数
据的交换的题目。一般有两个解法,对应这里的解法三和解法四。

解法三
的实现代码为:



char
*
strrev3(
const

char
*
str)







{



char
*
tmp
=

new

char
[strlen(str)
+

1
];





strcpy(tmp,str);





char
*
ret
=
tmp;





char
*
p
=
tmp
+
strlen(str)
-

1
;





while
(p
>
tmp)







{



*
p
^=

*
tmp;





*
tmp
^=

*
p;





*
p
^=

*
tmp;





--
p;





++
tmp;





}



return
ret;



}

解法四
的实现代码为:



char
*
strrev4(
const

char
*
str)







{



char
*
tmp
=

new

char
[strlen(str)
+

1
];





strcpy(tmp,str);





char
*
ret
=
tmp;





char
*
p
=
tmp
+
strlen(str)
-

1
;





while
(p
>
tmp)







{



*
p
=

*
p
+

*
tmp;





*
tmp
=

*
p
-

*
tmp;





*
p
=

*
p
-

*
tmp;





--
p;





++
tmp;





}



return
ret;





}

我们还可以通过递归的方法实现

void strrev(char *str)
{
if(str[0]=='/0')
return ;
else
{
strrev(str+1);
putchar(str);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: