这道题目有很多O(n)解法。
(1)可以用unordered_map。但这个很难说是O(n),哈希冲突是难以预测的,理论上可以算O(n).
class Solution {
public:
int singleNumber(int A[], int n) {
if(n<=0) return -1;
unordered_map<int,int> mp;
for(int i=0;i<n;++i)
mp[A[i]]++;
for(auto p:mp){
if(p.second==1)
return p.first;
}
}
};
(2)位运算,这也许是该题的本意。下面的是最容易理解的方法。统计每位出现1的次数,只出现一次的位相或起来就是唯一的书。简单,但是系数有点高。
class Solution {
public:
int singleNumber(int A[], int n) {
if(n<=0) return -1;
int res=0;
for(int i=0;i<32;++i){
int cnt=0,shift=1<<i;
for(int j=0;j<n;++j)
if(A[j]&shift) cnt++;
if(cnt%3) res = res | shift;
}
return res;
}
};
上面两个实现,大概都要80ms,效率算是差的。还有一种效率高的,我没实现且觉得不易理解。说明这方面的知识欠缺,等觉得容易了再来实现。本文参考了http://blog.youkuaiyun.com/kenden23/article/details/13625297