編寫字串反轉函式strrev
阿新 • • 發佈:2019-01-03
問題
編寫字串反轉函式: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);
}