Wednesday, November 26, 2008

一道题目:2n+1个数中,n个数出现两次,1个数出现1次。O(n)求只出现一次的数

newsmth上的cfans给出了一个很好的解释,
适用于此种题目的generalized版本:
一个元素个数为(n*s+t)的序列里,有n个数出现s次,s是偶数,有1个数出现t次,t是奇数。
求出现奇数次数的数。
转载如下:

N个数,只有一个出现奇数次,其它偶数次,基于
的数学原理是
a xor b xor c
=(a xor b) xor c  = a xor (b xor c)
满足结合律
a xor b = b xor a
满足交换律。

a^(2n)=0
a^(2n-1)=a
a xor 0 = a
a xor 1..1 = bitwise not a

<{0,a}, xor>构成一个群。
0是单位元,a是"0元"。
所以异或下来,就剩下那个数了。
这个题目不行。

因为那个数出现两次,根据结合律和交换律,
必然可以写成 …… (a xor a) ……
=…… xor 0 = ……
0对于异或操作是单位元。

对于这道题目,显然出现两次的数异或后都为0了。而0异或上任何数还是0.
最后异或得到的结果就是那个数。

No comments: