題目:給定一個非空的整數(shù)數(shù)組废岂,除了某個元素進出現(xiàn)一次以外,其他元素均出現(xiàn)2次狱意,請找出哪個只出現(xiàn)一次的元素湖苞?
說明: 算法應(yīng)具有線性時間復(fù)雜度,可以不使用額外的空間來實現(xiàn)嗎详囤?
題目考察的知識點
異或運算
财骨, 其中異或運算滿足如下定理
1、異或運算滿足結(jié)合律 即 a(bc) = (ab)c
2、異或運算滿足交換律 即 a^b = b ^a
3隆箩、任意數(shù)與自身異滑肉,均是0 即 a^a = 0
4、任意一個數(shù)與0異或摘仅,均是其本身 即a ^ 0 = a
測一測是否理解了?????
臨時插入題目:不用新的變量问畅,完成兩個數(shù)的交換娃属?
int a = 2;
int b = 3;
System.out.println("a的值是:" + a + "\t b的值是: " + b);
a = a ^ b;
b = a ^ b;
a = a ^ b;
System.out.println("a的值是:" + a + "\t b的值是: " + b);
/*
* 解析:
* 第二行中 b = a ^ b 將第一行中的a = a ^ b代入 即
*
* b = (a ^ b) ^ b ==> a ^ b ^ b ==> a ^ (b ^ b) = a ^ 0 = a;
*
* 所以說此時 b = a
*
* 第三行中 a = a ^ b 同理做運算,將第二行中的代入
* a = a ^ b = a ^ (a ^ b) = b;
*
* 此時 a = b;
題目的代碼解答如下:
int[] arr = {1,2,2,3,3,4,4};
//方法一:采用異或運算的形式去解決
//因為a^a = 0 且 a^0 = a, 在通過交換律护姆,這樣最后只會剩下最后一個單個的數(shù)
int result = 0;
for(int i: arr) {
result = result ^ i;
}
System.out.println("唯一的數(shù)是:" + result);
運行結(jié)果: