package yihuo.demo01.yihuo; /* 题目要求找出数组中出现奇数次的两种数 */ public class demo04 { public static void main(String[] args) { int[] arrayA = {5,2,3,3,4,4,4,4,5,5}; //首先我设一个异或变量 int eor = 0; for (int i = 0; i < arrayA.length; i++) { eor = eor ^ arrayA[i]; } //现在eor必然是那两种出现奇数次的数的异或 //两种数顾名思义不相同,那么必然有一位上是1; //我找任意一位上是1的位 //不妨找最右侧是1的位 int onlyOne = eor & ((~eor)+1); int eor2 = 0; //把这个位置是0或1的数分开,所有元素与onlyOne进行与运算,结果不是零的话,这个数的该位置都是1,把这些数一起进行异或运算即可得到这两种数中的一个。 for (int i = 0; i < arrayA.length; i++) { if((arrayA[i] & onlyOne) != 0) { eor2 = eor2 ^ arrayA[i]; } } //再创建一个变量,此时eor2=其中一个数,一个数异或(一个数异或另一个数)=另一个数 int eor3 = eor ^ eor2; System.out.println(eor2); System.out.println(eor3); } }
04-16
581
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
05-06
375
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)