问题
编写字符串反转函数:strrev。要求时间和空间效率都尽量高。测试用例:输入“abcd”,输出应为“dcba”;
解法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 *strrev2(const char *str)
{
char *temp = new char[strlen(str)+1];
strcpy(temp,str);
char * ret = temp;
char * p = temp+strlen(str)-1;
while(p>temp)
{
char t = *temp;
*temp = *p;
*p = t;
--p;
++temp;
}
return ret;
}
解法3 异或交换
代码
char *strrev3(const char * str)
{
char * temp = new char[strlen(str)+1];
strcpy(temp,str);
char *ret=temp;
char *p = temp+strlen(str)-1;
while(p>temp)
{
*p^=*temp;
*temp^=*p;
*p^=*temp;
--p;
++temp;
}
return ret;
}
解法4 加减法交换
代码
char *strrev4(const char * str)
{
char * temp = new char[strlen(str)+1];
strcpy(temp,str);
char *ret=temp;
char *p = temp+strlen(str)-1;
while(p>temp)
{
*p =*p + *temp;
*temp=*p - *temp;
*p =*p - *temp;
--p;
++temp;
}
return ret;
}
解法5 递归交换
代码
char *reverse5(char* str,int len)
{
if(len<= 1)
return str;
char t = *str;
*str = *(str+len-1);
*(str+len-1) = t;
return (reverse5(str+1,len-2)-1);
}