面试题single number

leetcode原题:Given an array of integers, every element appears twice except for one. Find that single one.

  为什么答案是result=0^a[0]^a[1]......^a[n-1]?
  答:无论按照什么顺序将a[]中的数字异或,对于二进制表示的result中的每一位,a[]中成对出现的数字 总会让该位翻转相同的两次,这两次的结果和对这一位的贡献是0,然后0^x=x,不影响其他数字异或时对该位的贡献。最终result中的每一位上只剩那个没有人和它配对成功的single number了。
  其根本原因在于对result中的任何一位, a[]中的哪个数字来翻转(无论谁的1或者0过来求异或和)都是等价的,没有权重。假如给a[]中的每个数字标记一种颜色,那result的最终结果里的比特们一定是花花绿绿的。
 
推广:
照这么理解,这个方法还是下面这题的最优解:
一个数组中,只有一个数字出现了奇数次,其他都出现了偶数次。找出这个出现奇数次的数字。O(n)时间,O(1)空间。
另外,由于等价性,这种”记忆“本领只能记住奇次或偶次。如果把这种”记忆“本领推广,异或运算也相应推广,比如一个比特能有三个状态,这个解法就可以解:
数组A中,一个数字a出现了3n+1次,又有一个数字b出现了3n+2次,其他的数字都出现了3n次,找出这单个a与单个b的异或和。
更多的状态依此类推。
后面这段纯属直觉,如有不对还望指正。
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值