关于异或操做和它的算法题

首先一篇文章推荐:感觉异或的神奇,其中介绍了什么是异或,异或的定律:恒等律,归零律,交换律,结合律,以及一些常见用法和一个算法系列。很是好!算法

这个算法系列指的是:已知一个数组中除了1(2,3)个数字只出现一次,其他都出现2次,如何找到这1(2,3)个数。数组

这个算法系列的另外一种扩展是:已知一个数组中除了1个数字只出现了一次,其他都出现了3次,如何找到这1个数。spa

解题思路相似:找到一种操做(命名为op),这种操做使得 a op a op a = 0,能够将op当作跟异或具备相似性质的操做。这样的话解题方法就变成了对于全部的元素,执行op操做获得的最终结果就是想要找的数字。code

把异或看做是2进制加法不进位操做,则op能够理解为3进制加法不进位操做。可是这种操做不太容易实现,因此换一种思路。找到3个int值,做为32位位组,分别存储出现过1次的位,出现过2次的位,出现过3次的位,遍历数组,去掉出现3次的位,最终出现一次的位就是咱们要找的数字。代码以下。blog

 1 public static int singleNumber(int A[], int n) {
 2     int ones = 0;
 3     int twos = 0;
 4     int threes = 0;
 5     int i = 0;
 6 
 7     for (i = 0; i < n; i++) {
 8         threes = twos & A[i];//目前出现三次的
 9         twos ^= ones & A[i];//获得出现两次的
10         ones ^= A[i];//目前出现一次
11         ones &= ~threes;//去掉出现三次的位
12         twos &= ~threes;//去掉出现三次的位
13     }
14     return ones;
15 }
相关文章
相关标签/搜索