一个数组中有两种数出现了奇数次,其他数出现了偶数次,怎么找出打印这两种数
这个问题我们涉及到异或运算 和 怎么将一个数的最右边取出来
有这样一个结论
1.任何数异或0 都为自己本身
2.任何数和自己异或都为0
所以如果有这么一个数组[1,1,2,3,4,4,2,3,2,3,1,1]
我们可以发现2 和 3出现的次数为奇数次
我们将整个数组异或得到的值为 2和3的异或值
00000000 00000000 00000000 00000010
00000000 00000000 00000000 00000011
得到结果为
00000000 00000000 00000000 00000001
我们再将最右边的1取出来可以判定这个属猪可以分为2类
要么00000000 00000000 00000000 00000001 进行& 操作为0的数要么为不为0的数
那么我们就可以写出代码
public static void printOddTimesNum2(int[] arr){
int eor = 0;
for(int i=0;i<arr.length;i++){
eor^=arr[i];
}
int Right = eor&((~eor)+1); //取出最右边的值
int oneAddTimes = 0;
for(int i=0;i<arr.length;i++){
if((Right & arr[i])!=0){
oneAddTimes^=arr[i]; //这里可以得出第一个奇数
}
}
System.out.println(oneAddtimes);
System.out.println(oneAddtimes^eor);
}