寻找两个出现奇数次的数——异或的使用


题目:

已知在一批数组中,两个值出现了奇数次,其他值都出现了偶数次,快速找出出现奇数次的两个数

代码及注释解析:

 1 public static void FindTwoOddTimes(int[] arr)
 2     {
 3         int ans1 = 0,ans2 = 0;
 4         int eor = 0;
 5         for (int i = 0; i < arr.length ; i++) 
 6         {
 7             eor ^= arr[i];
 8         }
 9         
10         //找出eor的最右端1位(这一位为1意味着出现奇数次的这两个值在这一位一个是0,一个是1,所以可以用这个作区分
11         //来分别找出这两个数)
12         int rightOne = eor & (~eor + 1);//eor与eor的补码相与即可获得其最右位为1其余位均为0的值
13                                         //如:eor为101100100,则通过该行得到000000100
14         
15         for (int i = 0 ; i < arr.length; i++)
16         {
17             if ((arr[i] & rightOne) != 0)
18             {
19                 ans1 ^= arr[i];
20             }
21             else 
22             {
23                 ans2 ^= arr[i];
24             }
25         }
26         System.out.println(ans1 + " "+ ans2);
27     }

相关