找到出现个数为奇数次的数
问题
1.一种数出现奇数次,其他数都出现偶数次,怎么找到这个出现奇数次的数
2.有两个数出现奇数次其他数都出现偶数次,怎么找到这两个数异或
技巧
int rightOne = xor & (~xor + 1); //提取出最右边的那个1
代码
public class Problem01_findOdd {
public static void main(String[] args) {
int[] arr1 = {1, 2, 2, 3, 3, 7, 4, 1, 7, 8, 8};
int[] arr2 = {1, 2, 2, 3, 9, 3, 7, 4, 1, 7, 8, 8};
process1(arr1);
process2(arr2);
}
//1.一种数出现奇数次,其他数都出现偶数次,怎么找到这个出现奇数次的数
public static void process1(int[] arr) {
//直接异或,所有数异或的值就是那个出现奇数次的数
int xor = 0;
for (int num : arr) {
xor ^= num;
}
System.out.println("xor=" + xor);
}
//2.有两个数出现奇数次其他数都出现偶数次,怎么找到这两个数
public static void process2(int[] arr) {
int xor = 0;
for (int num : arr) {
xor ^= num;
}
//此时获得的xor是两个数异或的值
//那么这两个数异或的值的二进制形式一定存在至少某一位为1(异或的结果不同为1)
int rightOne = xor & (~xor + 1); //提取出最右边的那个1
int res1 = 0;
for (int num : arr) {
if ((num & rightOne) == 0) res1 ^= num; //此时通过num&rightOne)==0把数组分成两部分,两个出现个数为奇数的数分别在两个部分
}
int res2 = xor ^ res1;
System.out.println("res1=" + res1 + ",res2=" + res2);
}
}