问题描述1
已知一个数组中只有一个数出现了奇数次,其他的都是出现了偶数次,打印出这个出现了奇数次的数
代码实现
public class EvenTimesOddTimes {
/**
* 一个数组中,有一个数出现了奇数次,其他数字出现了偶数次
* 打印出出现了奇数次的那个数字
* 使用了异或运算的计算规律
* 异或运算只与某一位上1的个数有关,与运算顺序无关
* @param arr
*/
public static void printOddTimesNum1(int[] arr){
int eor = 0;
for(int i=0; i<arr.length; i++){
eor = eor ^ arr[i];
}
System.out.println(eor);
}
}
问题描述2
一个数组中,只有2个数出现了奇数次,其他数字都出现了偶数次,打印出出现了奇数次的2个数
public class EvenTimesOddTimes {
/**
* 一个数组中,只有2个数出现了奇数次,其他数字都出现了偶数次
* 打印出出现了奇数次的2个数
* @param arr
*/
public static void printOddTimesNum2(int[] arr){
int eor = 0;
int onlyOne = 0;
for(int num : arr){
eor = eor ^ num;
}
//eor = a ^ b
//eor != 0
//eor必有一个位置上是1
int rightOne = eor & (~eor + 1); //提取出最右侧的1(表示成二进制数的样子)
for(int cur : arr){
if((rightOne & cur) == 0){//找出这个位置上是0的数(那两个出现了基数次的数中的一个数必然被分到了这组中,另一个在该位置上是1的数中)
onlyOne ^= cur;//因为这组数中确定只有一个出现了奇数次的数,所以用printOddTimesNum1的思想可以找出这个基数次的数
}
}
System.out.println(onlyOne + " " + (eor ^ onlyOne));
}
}