问题出自编程之美,简化问题描述
问题1:有n数a1,a2,,,,,an,其中只有一个数只出现了一次,其余数均出现了两次,求出这个数,比如7 7 6 6 3,答案是3
利用异或运算,举上例说明
7,7,6,6,3在位运算时的表示为
111,111,110,110,011
将各位异或,
第一位1^1^1^1^0=0
第二位1^1^1^1^1=1
第三位1^1^0^0^1=1
011=3,正好是答案
将所有数异或,对于只出现了一次的数,
二进制为1对应的位上的1的个数一定是奇数,异或后是1
二进制为0对应的位上的0的个数一定时偶数,异或后是0
由上两条知,异或的结果一定是答案
问题2:有n数a1,a2,,,,,an,其中只有两个不相同的数分别只出现了一次,其余数均出现了两次,求出这个数,比如7 7 6 6 3 5,答案是3 5
仍然将所有数异或
设两数是A,B
所有数异或的结果C=A^B
如例子所有数异或后的结果为110
对于110这个二进制数来说,其中的1代表A和B有且仅有一个数在该位上为1
比如我取左起第一个二进制位,该位为1
对于所有数
111
111
110
110
011
101
按照第一位是否为1分成两组,A和B必定被分到两个不同的组里
111
111
110
110
101
和
011
第一组所有数异或后的结果为101,第二组为011,答案求出