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

来源:互联网 发布:电信网络电视多少钱 编辑:程序博客网 时间:2024/05/18 03:39

给n个数

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

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

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

n<=10^7


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

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

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

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

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

好高科技诶~~~

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


代码:(281ms,236kb)

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


原创粉丝点击