title: 异或去重
date: 2018-02-21 22:32:55
—categories:
- Algorithm
tags:
- Algorithm
来看三道题目
1、1-1000放在含有1001个元素的数组中,只有唯一的一个元素值重复,其它均只出现一次。每个数组元素只能访问一次,设计一个算法,将它找出来;不用辅助存储空间,能否设计一个算法实现?
当然,这道题,可以用最直观的方法来做,将所有的数加起来,减去1+2+3+…+1000的和,得到的即是重复的那个数,该方法很容易理解,而且效率很高,也不需要辅助空间,唯一的不足时,如果范围不是1000,而是更大的数字,可能会发生溢出。
我们考虑用异或操作来解决该问题。现在问题是要求重复的那个数字,我们姑且假设该数字式n吧,如果我们能想办法把1-1000中除n以外的数字全部异或两次,而数字n只异或一次,就可以把1-1000中出n以外的所有数字消去,这样就只剩下n了。我们首先把所有的数字异或,记为T,可以得到如下:
T = 1^2^3^4…^n…^n…^1000 = 1^2^3…^1000(结果中不含n)
而后我们再让T与1-1000之间的所有数字(仅包含一个n)异或,便可得到该重复数字n。如下所示:
T^(1^2^3^4…^n…^1000) = T^(T^n) = 0^n = n
2、一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
样例输入:2 4 3 6 3