面试题single number

来源:互联网 发布:tophat算法 编辑:程序博客网 时间:2024/06/01 07:35

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的异或和。
更多的状态依此类推。
后面这段纯属直觉,如有不对还望指正。
0 0