代码及思路
按位或 | ,有一为一,其他为零。(二进制位中对应运算的两个二进制位,只要有一个为1,其结果就是1)
0011 10进制3
0010 10进制2
0011 10进制3(结果)
按位与 & ,均一为一,其他为零。(对应的二进制位均为1,结果才是1)
0011 10进制3
0010 10进制2
0010 10进制2(结果)
按位异或 ^,不同为一,其他为零。(比如 (1^0) (0^1))
0011 10进制3
0010 10进制2
0001 10进制1(结果)
/**
* 这里有一个“定理” :
* 两个相同的数字进行异或,结果为零。
* 零和任何数字进行异或,结果为那个任何数字。
*
* 拓展推理:
* 二进制位进行的运算,与,异或,或,与顺序无关。
* 题目中,只有一个数字只出现一次,其他数字都出现两次。
* 由于已经知道以二进制位进行的运算和顺序无关。
* 那么最终必然为: 1 ^ 1 ^ 2 ^ 2 ^ 3 ^ 3 ^ 4 = 4。(举个栗子)
*
*/
public int singleNumber(int[] nums) {
int x = nums[0];
for( int i = 0 ; i < nums.length ; i ++ ){
x ^= nums[i];
}
return x;
}