异或运算
相同为0,不同为1 ^
满足交换律和结合律
int a = 17;
int b = 20;
// 交换a ,b
a = a ^ b;
b = a ^ b;
a = a ^ b;
// 第一行代码: a = 17^20; b = 20;
// 第二行代码: a = 17^20; b = 17^20^20;
// 第三行代码: a = 17^20^17; b = 17^20^20;
// 根据相同为0;a=20;b=17;
面试题目:
找出数组中奇数次的数 要求O(N) 空间 N(1)
public void printOddTimesNum1(int [] arr){
int eor = 0;
for(int cur:arr){
eor^=cur;
}
System.out.println(eor);
}
找出数组中两个奇数次的数 要求O(N) 空间 N(1)
public void printOddTimesNum2(int[] arr) {
int eor = 0;
for (int cur : arr) {
eor ^= cur;
}
// eor = a ^ b;
// 这里面先取反加一 找到最右边的第一个不通过的位
int rightOne = eor&(~eor+1);
int onlyOne = 0;
// 这里得到 a 或者 b其中的一个
for (int cur : arr){
// 如果位数为零的数进行异或,得到其中一个数
if((cur & rightOne) == 0){
onlyOne ^=cur;
}
}
// 对eor^onlyOne = a^b^b 得到 第二个数
System.out.println("第一个是:"+(eor^onlyOne)+"第二个是"+onlyOne);
}