第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、付费专栏及课程。

余额充值