原题:
Given a non-empty 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?
Example 1:
Input: [2,2,1] Output: 1
Example 2:
Input: [4,1,2,1,2] Output: 4
题意是找到只有一个的数字,先想到暴力解法O(n^2):
class Solution {
public:
int singleNumber(vector<int>& nums) {
int find=0;
for(vector<int>::iterator it=nums.begin();it<nums.end();it++){
cout<<*it;
for(vector<int>::iterator is=nums.begin();is<nums.end();is++){
if(*it==*is){find++;}
}
if(find==2){cout<<*it<<endl;find=0;}
else return *it;
}
return INT_MAX;
}
};
不出意外超时了,然后想到设置指示容器,处理一个数时,在容器中找到相同数的话pop,没有时push,因为还是属于O(n^2)结果并不够好:
Success
Runtime: 220 ms, faster than 5.41% of C++ online submissions for Single Number.
Memory Usage: 10 MB, less than 21.90% of C++ online submissions for Single Number.
代码:
class Solution {
public:
int singleNumber(vector<int>& nums) {
vector<int> findelem;
for(vector<int>::iterator it=nums.begin();it<nums.end();it++){
vector<int>::iterator f=find(findelem.begin(),findelem.end(),*it);
if(f==findelem.end()){findelem.push_back(*it);continue;}
else findelem.erase(f);
}
return findelem[0];
}
};
然后想到用哈希表来减少查找次数,结果:
Success
Runtime: 112 ms, faster than 5.41% of C++ online submissions for Single Number.
Memory Usage: 10.6 MB, less than 21.50% of C++ online submissions for Single Number.
可以看到效果不是特别好,代码:
class Solution {
public:
int singleNumber(vector<int>& nums) {
vector<int> findelem;
int hash[99999]={};
for(vector<int>::iterator it=nums.begin();it<nums.end();it++){
if (hash[abs(*it)%99999]>0){
vector<int>::iterator f=find(findelem.begin(),findelem.end(),*it);
if(f==findelem.end()){findelem.push_back(*it);hash[abs(*it)%99999]++;continue;}
else {findelem.erase(f);hash[abs(*it)%99999]--;}
}
else {findelem.push_back(*it);hash[abs(*it)%99999]++;}}
return findelem[0];
}
};
然后就想不到办法了,看了一下解法,还有两种,一种是数学法,c++下不好使因为没有python中的set函数对应功能的函数,还有一个就比较有意思了,用到了按位异或运算,原理是a⊕b⊕a=(a⊕a)⊕b=0⊕b=b,结果:
Success
Runtime: 12 ms, faster than 97.96% of C++ online submissions for Single Number.
Memory Usage: 9.7 MB, less than 58.27% of C++ online submissions for Single Number.
代码:
class Solution {
public:
int singleNumber(vector<int>& nums) {
int result=0;
for(vector<int>::iterator it=nums.begin();it<nums.end();it++){
result^=*it;
}
return result;
}
};