AC截图
题目
代码
class Solution {
public:
int singleNumber(vector<int>& nums) {
if(nums.size()==1) return nums[0];
sort(nums.begin(),nums.end());
for(int i=1;i<nums.size()-1;){
if(nums[i]==nums[i-1]){
i+=2;
}else{
return nums[i-1];
}
}
return nums[nums.size()-1];
}
};
优化思路
优化的核心在于利用了异或运算的以下性质:
-
交换律:
a ^ b = b ^ a
-
结合律:
(a ^ b) ^ c = a ^ (b ^ c)
-
任何数与自身异或结果为0:
a ^ a = 0
-
任何数与0异或结果为其本身:
a ^ 0 = a
基于这些性质,考虑如下情况:
-
如果数组中有两个相同的数字
a
,它们的异或结果是a ^ a = 0
。 -
如果我们将数组中所有数字进行异或操作,成对出现的数字会相互抵消(因为
a ^ a = 0
),而只出现一次的那个数字会保留下来(因为a ^ 0 = a
)。
优化代码
class Solution {
public:
int singleNumber(vector<int>& nums) {
int ret = 0;
for(int num:nums){
ret ^= num;
}
return ret;
}
};