方法一:哈希表计数
class Solution {
public:
int singleNumber(vector<int>& nums) {
unordered_map<int,int> map;
int len=nums.size();
int ans=0;
for(int i=0;i<len;i++)
{
map[nums[i]]=0;
}
for(int i=0;i<len;i++)
{
map[nums[i]]++;
}
for(int i=0;i<len;i++)
{
if(map[nums[i]]==1)
{
ans=nums[i];
}
}
return ans;
}
};
方法二:位运算
按位计算,将所有数按位加在一起,然后%3,如果%3==1,说明这个是数量为1的数的一部分,全部设完32位,时间复杂度为O(32n)
class Solution {
public:
int singleNumber(vector<int>& nums) {
int arr[32]={0};
int len=nums.size();
for(int i=0;i<len;i++)
{
for(int j=0;j<32;j++)
{
arr[j]+=((nums[i]>>(31-j))&1);//注意矩阵是反过来存的
}
}
int sum=0;
for(int j=0;j<32;j++)
{
if(arr[j]%3==1)
{
sum+=1<<(31-j);//注意矩阵是反过来存的
}
}
return sum;
}
};