??異或髓削,位運算的一種:相同為0,不同為1捣辆。兩個整數(shù)做異或蔬螟,其實相當于這兩個數(shù)無進位相加。
??異或滿足的一些性質:0^a=a
汽畴,a^a=0
,a^b=b^a
耸序, a^(b^c)=(a^b)^c
??面試題:
問題描述:
給定一個整形數(shù)組忍些,
(1)假設其中只有1種數(shù)出現(xiàn)了奇數(shù)次,找出它坎怪;
(2)假設有兩種數(shù)出現(xiàn)了奇數(shù)次罢坝,找出它;
??直接看代碼:
/**
* 問題描述:
* 給定一個數(shù)組,當中有兩種數(shù)出現(xiàn)的次數(shù)為奇數(shù)次嘁酿,找出它們
* **/
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,去與數(shù)組中每一個數(shù)做異或
* 假設這兩種數(shù)為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);
}
}