力扣HOT100之技巧:136. 只出现一次的数字
这道题一开始想着用哈希表来做,但是如果用哈希表来做的话空间复杂度为O(n)
,我们还需要使用其他的技巧,这里我们使用异或操作。首先,我们需要知道异或的以下性质:
对于任意整数a
,有
- 0 ^ a = a
- a ^ b = b ^ a(交换律)
- a ^ a = 0
- (a ^ b) ^ c = a ^ (b ^ c) (结合律)
根据交换律和结合律,我们可以将数组中出现两次的数都挪到前面,定义一个变量result
,初始化为0
,然后通过一个for
循环实现0 ^ a1 ^ a1' ^ a2 ^ a2'... ^ b
,根据以上的性质,最终将化简为0 ^ b = b
,其中ai == ai'
,b
为仅出现一次的元素,按照上面的操作,我们最终会计算出仅出现一次的元素,返回即可。
class Solution {
public:int singleNumber(vector<int>& nums) {int result = 0;for(int i = 0; i < nums.size(); i++)result = result ^ nums[i];return result;}
};