颠倒一个字符串。优化时间,优化空间。
此题也就是字符串倒置,类似的问题经常在面试中出现,我在stackoverflow上查到一个很不错的方法
#include <stdio.h>
#include <string.h>
char* reverse(char* str)
{
int end = strlen(str) - 1;
int start = 0;
while(start<end)
{
str[start] ^= str[end];
str[end] ^= str[start];
str[start] ^= str[end];
++start;
--end;
}
return str;
}
int main()
{
char str[] = "my name is steve marbo";
printf("before reverse:\n");
printf("%s\n", str);
printf("after reverse:\n");
puts(reverse(str));
}
上面这个reverse函数里的while循环中 ^= 操作符是倒置的具体操作
A^=B
B^=A
A^=B
以上三步操作实际就是把A和B的值互换一下,为什么呢?
计算机中任何表示最终都会化为二进制表示
A是一个字符,我们假定它的二进制为 01001100
B是一个字符,我们假定它的二进制为 10100001
^是异或操作符, 也就是说
0^0 = 0
0^1 = 1
1^0 = 1
1^1 = 0
相同得0,不同得1
那么,A^=B 相当于 A = A^B,
第一步:A = A^B = 01001100 ^ 10100001 = 11101101
第二步:B = B^A = 10100001 ^ 11101101 = 01001100
第三步:A = A^B = 11101101 ^ 01001100 = 10100001
这时发现
A = 10100001
B = 01001100
即A和B的值互换了