假设你有一个用1001个整数组成的数组,这些整数是任意排列的,但是你知道所有的整数都在1到1000(包括1000)之间。此外,除一个数字出现两次外,其他所有数字只出现一次。假设你只能对这个数组做一次处理,用一种算法找出重复的那个数字。如果你在运算中使用了辅助的存储方式,那么你能找到不用这种方式的算法吗?
解析:也就是1001个数只有一个重复,那么剩余1000个数不重复,加上在1到1000,设重复的数为A,则1+2+3+。。。+1000+A = sum,1+2+3+。。。+1000=sum2,A = sum - sum2。
延伸:如一个整型数组a[n],只有一个数出现了一次,其他数都出现了两次,求这个只出现一次的数,要求时间复杂度O(n),空间复杂度O(1)。
解析:
1、蛮力法。对每一个元素,遍历数组。时间复杂度O(n^2)
2、排序+遍历。O(nlgn)
3、hash。 空间复杂度O(n)
4、异或。 A^A = 0
A^B^B^C^C...Z^Z = A
延伸:只有一个数出现奇数次,其他都出现偶数次。
延伸:有两个不相同的数只出现一次,或奇数次。
A^B^C^C^D^D^...^Z^Z = A^B = sum
找出A、B中任意一个
B = sum^A;
A = sum^B;