非常巧妙的一道题,要求在线性时间内不用额外空间找出数组中只出现一次的数字。 思考了半天,没找到做法。和之前做过的类似要求的找出数组中出现两次的数字不同,数字的取值范围没规定,无法扫描一次实现排序。 利用数学的手段也没想到解法。 看了解答,异或的方法的确想不到,但是的确是最好的答案。 位运算在我编程时实际使用不多,有点遗忘了。
这道题利用了异或的三个特性。
1. a^b = b^a
2. (a^b)^c = a^(b^c)
3. 0^a = a
异或规定两位相同则为0,不同则为1。而数组中的所有数字异或起来可以利用交换律先使相同的数字先两两异或,结果为0;若干个0之间的异或还为0,0和单独的数字异或即为最后只出现一次的数字。 位运算需要多加注意和联系。这道题目和找出数组中出现两次的数字那道题应该统一记忆。 都是运用了比较巧妙的方法。 之后复习的时候应该多注意!!
public class Solution {
public int singleNumber(int[] A) {
if( A.length == 0)
{
return 0;
}
int res = A[0];
for( int i=1;i<A.length;i++ )
{
res = res^A[i];
}
return res;
}
}