位运算奇妙无穷啊。这个题目巧妙的运用了xor位运算。异或具有以下性质

  1. 交换率
  2. 结合律
  3. 对于任意数x, x ^ x = 0, x ^ 0 = x

所以把所有的数异或起来,成对出现的就会消掉,只剩下那个出现过一次的数

1
2
3
4
5
6
7
public int singleNumber(int[] nums) {
int ans = 0;
for (int n : nums) {
ans ^= n;
}
return ans;
}