寻找两个出现奇数次的数——异或的使用
题目:
已知在一批数组中,两个值出现了奇数次,其他值都出现了偶数次,快速找出出现奇数次的两个数
代码及注释解析:
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 }