问题来源:
问题描述:
Given an array of integers, every element appears twice except for one. Find that single one.
Note:
Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?
我的解决方案:
class Solution {
public:
int singleNumber(vector<int>& nums) {
map<int,int> m;
int tmp;
for(int i=0;i<nums.size();++i)
{
tmp=nums[i];
if(m.find(tmp)==m.end())
m.insert(pair<int,int>(tmp,i));
else
m.erase(m.find(tmp));
}
return m.begin()->first;
}
};
根据题目描述,除了唯一的single number,别的数字都重复两次,所以想到用map来做,一次插入一次删除,剩下的就只有所求的那个数.AC之后查看时间复杂度,发现在C++类别里面是倒数的,也好理解,每一次都要去查找,插入,删除,即使用hashmap也快不到哪里去.最开始想过用bitmap来做,但没想出好方法.看别人的解决方案,得到了一个巧妙的方法,收录如下:(援引自xuhua.alex)
原理是这样的: A^B^A=B
class Solution {
public:
int singleNumber(vector<int>& nums) {
if(nums.empty()) return 0;
int first = nums[0];
for(int i = 1; i<nums.size();i++) {
first = first ^ nums[i];
}
return first;
}
};