问题描述
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
解题报告
不考虑限制条件,该题有如下解决方法:
- 集合
当遇见一个尚未见过的元素时,加入集合;
当遇见一个已经见过的元素时,将该元素从集合中删除。
最后集合中只剩下一个目标值。 - 异或
a ⨁ 0 = a a\bigoplus 0=a a⨁0=a
a ⨁ a = 0 a\bigoplus a=0 a⨁a=0
a ⨁ b ⨁ a = ( a ⨁ a ) ⨁ b = 0 ⨁ b = b a\bigoplus b\bigoplus a=(a\bigoplus a)\bigoplus b=0\bigoplus b=b a⨁b⨁a=(a⨁a)⨁b=0⨁b=b
所以将所有的元素进行异或处理,则最后生下来的元素必定是只出现一次的目标值。
实现代码
- 集合
class Solution {
public:
int singleNumber(vector<int>& nums) {
set<int>s;
for(int i=0;i<nums.size();i++){
if(s.find(nums[i])==s.end()){
s.insert(nums[i]);
}
else{
s.erase(nums[i]);
}
}
return *s.begin();
}
};
- 异或
class Solution{
public:
int singleNumber(vector<int>&nums){
int a=0;
for(int i=0;i<nums.size();i++){
a^=nums[i];
}
return a;
}
};