编写反转字符串的程序,要求优化速度、优化空间
(1)第一次看到这个题目首先想到遍历这个字符串,把第一个和最后一个字符交换,第二个和倒数第二个交换,
依次循环即可,下面时代码
(2)用数组下标的方式访问数组,实际上用指针直接操作即可
显 然上面的两个解法中没有考虑时间和空间的优化,一个典型的优化策略就是两个字符交换的算法优化,我们可以完全不使用任何外部变量即完成两个字符(或者整 数)的交换,这也是一个很经典的面试题目。特别是一些嵌入式硬件相关编程中经常要考虑寄存器的使用,因此经常有不使用任何第三个寄存器即完成两个寄存器数 据的交换的题目。一般有两个解法,对应这里的解法三和解法四。
解法三 的实现代码为:
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 * 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;
}
{
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;
}
我们还可以通过递归的方法实现