给你一个 非空 整数数组 nums
,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。
示例 1 :
输入:nums = [2,2,1] 输出:1
这道题最容易想到的方法是用哈希表存储每个数字和该数字出现的次数。最后遍历哈希表,得到只出现一次的数字。
class Solution {
public:
int singleNumber(vector<int>& nums) {
int len = nums.size();
map<int,int> map;
for(int e : nums){
map[e]++;
}
for(int e : nums){
if(map[e]==1)
{
return e;
}
}
return 0;
}
};
但是这样做需要遍历两次,不够优雅
这题最佳做法是 位运算
异或运算有三条性质:
1、任何数和 000 做异或运算,结果仍然是原来的数
2、任何数和其自身做异或运算,结果是 000
3、异或运算满足交换律和结合律
因此,这道题可以理解为求数组中的全部元素的异或运算结果
即为数组中只出现一次的数字。
class Solution {
public:
int singleNumber(vector<int>& nums) {
int ret = 0;
for (int e: nums) ret ^= e;
return ret;
}
};