在做Cracking Code interview里的一道经典题目时:写一个函数把C风格的字符串(即以'\0' 结尾的字符串,"abcd"的长度是5)反转;
我写了一个对半分的reverse代码,用了递归,感觉封装得挺好:
unsigned int getLength(char* str)
{
unsigned int len = 0;
while(str[len++]);
return len;
}
void swap(char& a, char& b)
{
char tmp = a;
a = b;
b = tmp;
}
void reverse(unsigned int start, unsigned int end, char* str)
{
if(start>=end) return;
else
{
swap(str[start], str[end]);
reverse(start+1,end-1, str);
}
}
void reverse(char* str)
{
int len = getLength(str);
reverse(0, len-2, str);
}
而书上的答案优雅得谅人:
void reverse(char* str)
{
char* end = str;
char tmp;
//using the str as an address
if(str)
{
while(*end)end++;
end--;
while(end > str)
{
tmp = *end;
*end-- = *str;
*str++ = tmp;
}
}
}
这段代码有几个特点:
1. 指针的运用非常灵活,一时间是一个地址,用了*, 用了 ++, --这样的运算符去操控指针,挺神奇的;
2. 字符串的结束符是一个'\0', 等于int值里的0, 等于直指里的false, 所以代码里可以用来做while循环的结束条件;
3. 总共的space只用了一个指针,一个char 变量,小得惊人
4. 时间效率是O(n), n是输入字符串长度