第3题 reverse字符串

颠倒一个字符串。优化时间,优化空间。


此题也就是字符串倒置,类似的问题经常在面试中出现,我在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的值互换了


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值