1. 只出现一次的数字(LeetCode 136)中异或的三条性质如何保证成对元素抵消,为什么不需要额外空间?
只出现一次的数字,说明异或的三条性质如何保证成对元素抵消,以及为何不需要额外空间?
- 异或三条性质
- 成对元素抵消
- O(1) 空间
只出现一次的数字:数组中除了一个元素出现一次,其余都出现两次,求该元素。用异或:对所有元素做异或,结果就是只出现一次的元素。异或三条性质:① 交换律/结合律(a⊕b = b⊕a、(a⊕b)⊕c = a⊕(b⊕c));② 自反性(a⊕a=0);③ 恒等(a⊕0=a)。由性质②,成对出现的相同元素异或为 0;由性质③,0 与只出现一次的元素异或为该元素本身。所有元素异或 = (成对元素异或为 0) ⊕ (单次元素) = 单次元素。不需要额外空间:只用了一个变量存异或结果,无需哈希表或数组,O(1) 空间。O(n) 时间。
异或的"自反性"(a⊕a=0)是本题核心:成对元素自消,单次元素保留。三条性质结合保证一次遍历即可。这是"位运算替代哈希表"的经典 O(1) 空间解法。
int singleNumber(int[] nums) {
int res = 0;
for (int x : nums) res ^= x; // 成对抵消,单次保留
return res;
}