题目1:已知在一个整型数组中,只有一种数出现了奇数次,其他的所有数都出现了偶数次,请找出出现了奇数次的这个数。
异或全部,结果就是那个出现了奇数次的数。
Java代码如下
public static int findNum(int[] arr){
int result = 0;
for (int i : arr){
result ^= i;
}
return result;
}
题目2:有两种数出现了奇数次,其他所有数出现了偶数次。怎么样找到这两种数。
获取全部异或结果。然后获取到二进制中最右边的那一个1。用这个1来区别a和b。得到a或者b以后,a^ (a^b)=b。可以得出另外一个数。
Java代码:
public static void findNum2(int[] arr){
int tem = 0;
for (int i:arr){
tem ^= i;
}//tem 必然为 a^b。因为不是0。所以肯定二进制中肯定有一位1
int rightOne = tem & (~tem +1);//获取二进制中最右边的那一位1
int onlyOne = 0;
for (int j:arr){
if ((j&rightOne)==0){//找出其中一个a^b。a或者b。就是用最右边他俩不同的1来区分的。
onlyOne ^= j;
}
}
System.out.println(onlyOne + " " + (onlyOne^tem) );
}