快速找出故障机器

来源:互联网 发布:广数英制螺纹怎么编程 编辑:程序博客网 时间:2024/05/22 07:56

问题出自编程之美,简化问题描述

问题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,答案求出







原创粉丝点击