关于按位异或用于抵消成对出现的数据

5 篇文章 1 订阅
1 篇文章 0 订阅

给n个数

其中n-1个数出现了两次

只有一个数出现了一次,找到它并输出

一组测试,输入n个数,均可用int表示

n<=10^7


由于0^0为0,0^1为1,所以0按位异或任何数都是这个数字本身;

对于两个相同的数字,由于每一位都相同,所以这两个数的按位异或为0,于是就抵消了;

当数字不是按照两个相同数字连在一起给出时,会有以下几种情况:

ans = 0^n1
(第一个数)
n2
(第二个数)
ans ^= n2
(前两个数的按位异或)
ans ^= n1
(前两个数按位异或的结果再按位异或第一个数)
0000
0111
1010
1101

由此可见,当两个数据不相邻时,也可以将两个相同数字自行抵消

好高科技诶~~~

(思路源自行知哥哥~~)


代码:(281ms,236kb)

	int num,ans;
	ans = 0;
	while ( scanf("%d",&num) != -1 )
	{
		ans ^= num;
	}
	printf("%d",ans);


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值