思路
首先不考虑额外空间的话使用一个set去重即可。第二种就是异或运算。
异或操作的性质
- 身份元素:任何数与0进行异或运算,结果仍然是原数,即
x ^ 0 = x
。 - 自反性:任何数与自身进行异或运算,结果是0,即
x ^ x = 0
。 - 交换律:异或运算满足交换律,即
x ^ y = y ^ x
。 - 结合律:异或运算满足结合律,即
x ^ (y ^ z) = (x ^ y) ^ z
。
利用自反性相同的数异或都会得0,这个时候就是可以去掉所有的重复数,然后任何数与0进行异或运算,结果仍然是原数,这个时候就得到出现一次的元素了。代码如下:
public static int singleNumber(int[] nums) {
int eor = 0;
for (int num : nums) {
eor ^= num;
}
return eor;
}