题目描述:
给你一个整数数组 nums
,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。
示例 1:
输入:nums = [2,2,3,2] 输出:3
示例 2:
输入:nums = [0,1,0,1,0,1,100] 输出:100
思路1:最先想到的肯定是哈希表,两次遍历。第一次遍历求出每个元素出现的次数,第二次遍历找出出现次数为1的元素
tips:map和set里是不允许有重复元素的,就意味着count方法统计元素出现的次数只会返回0或1,这是我第一次犯下的错误,用count==1来判断结果发现怎么都不对。
代码实现
class Solution {
public:
int singleNumber(vector<int>& nums) {
unordered_map<int,int> mp;
int ans;
for(auto num :nums)
{
mp[num]++;
}
for(auto num :nums)
{
if(mp[num]==1)
{
ans=num;
break;
}
}
return ans;
}
};
思路2:利用位运算
我们知道每一位相加的结果无非就下面四种情况
我们要找的数记为ret,所有数该位求和结果%3得到的结果与ret相同,如果结果为1,我们就将该位改为1,如果为0则改为0,最后便能求得要找的数。
代码实现
class Solution {
public:
int singleNumber(vector<int>& nums) {
int ret=0;
for(int i=0;i<32;i++)
{
int sum=0;
for(int x:nums)
{
if((x>>i)&1==1)
sum++;
}
sum%=3;
if(sum==1)
ret|=1<<i;
}
return ret;
}
};