LeetCode - 136. 只出现一次的数字
题目
136. 只出现一次的数字 - 力扣(LeetCode)
思路和过程
异或解法的原理:
- 任何数异或自己等于0:a ^ a = 0
- 任何数异或0等于自己:a ^ 0 = a
- 异或操作满足交换律和结合律:a ^ b ^ a = (a ^ a) ^ b = 0 ^ b = b
因此,当数组中除了一个数出现一次外,其他数都出现两次时,将所有数异或在一起,相同的数会两两抵消(变为0),最终只剩下那个出现一次的数。
例如对于输入 [4,1,2,1,2]:
- result = 0
- result ^= 4 = 4
- result ^= 1 = 5
- result ^= 2 = 7
- result ^= 1 = 6 (1出现第二次,与第一次的1异或后抵消)
- result ^= 2 = 4 (2出现第二次,与第一次的2异或后抵消)
- 返回 4
这个解法的时间复杂度是O(n),空间复杂度是O(1),完美满足题目要求的线性时间和常量额外空间。
class Solution {
public:int singleNumber(vector<int>& nums) {int result=0;for(int i = 0; i<nums.size();i++){result ^= nums[i];}return result;}
};