异或,位运算的一种:相同为0,不同为1。两个整数做异或,其实相当于这两个数无进位相加。
异或满足的一些性质:0^a=a
,a^a=0
,a^b=b^a
, a^(b^c)=(a^b)^c
面试题:
问题描述:
给定一个整形数组,
(1)假设其中只有1种数出现了奇数次,找出它;
(2)假设有两种数出现了奇数次,找出它;
直接看代码:
/**
* 问题描述:
* 给定一个数组,当中有两种数出现的次数为奇数次,找出它们
* **/
public class cp2 {
public static void main(String[] args) {
int[] arr = {10, 20, 3, 3};
find2OddNum(arr);
int[] arr1 = {1, 2, 2};
find1OddNum(arr1);
}
public static void find2OddNum(int[] arr) {
int eor = 0;
for(int it : arr) {
eor ^= it;
}
/**
* 定义一个变量eor,赋初值为0,去与数组中每一个数做异或
* 假设这两种数为a、b,显然有a!=b
* 则eor=a^b
* 则eor!=0,则eor必然至少有1位为1
* 找出eor最右的1
* **/
int rightOne = eor & (~eor + 1);
int a = 0;
for(int it : arr) {
if ((it & rightOne) == rightOne) {
a ^= it;
}
}
System.out.println(a + " " + (eor ^ a));
}
public static void find1OddNum(int[] arr) {
int eor = 0;
for (int it : arr) {
eor ^= it;
}
System.out.println(eor);
}
}