快速找出故障机器

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

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







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值