题目地址
力扣
题目解析
位运算法
由题我们能知道该数组中只有一个数出现了一次,然而其他的数都出现了3次。
我们可以通过分析每一个二进制位的和来讨论这个题目的解法!
由于前边的条件,那么我们可以得出,某一个二进制位的和肯定满足一下四种情况的一种!
3n个0+0; 对该值进行对3取模 为0;
3n个0+1; 对该值进行对3取模 为1;
3n个1+0; 对该值进行对3取模 为0;
3n个1+1; 对该值进行对3取模 为1;
因此我们可以发现,对某一位求和并对3取模之后得到的二进制位值恰好是只出现一次的那个数的二进制位的值,因此我们可以利用这一点来求出这个只出现一次的数。
哈希方法
直接定义一个unordered_map<int,int>;来分别存放<数,该数出现的次数>,然后遍历求出每个数出现的次数,然后再遍历哈希表,来求出只出现一次的数!
代码编写
位运算方法
class Solution
{
public:
int singleNumber(vector<int>& nums)
{
// 先初始化一个每个二进制位都是0的数
int ret=0;
// 循环32次为每一位都赋值
for(int i=0;i<32;i++)
{
// 统计每一位的和
int sum=0;
// 由于0不影响取模的值,因此只计算有几个1即可
for(auto &e:nums)
if(((e>>i)&1)==1) sum++;
// 将结果取模
sum%=3;
// 若值为1则该二进制位就为1
if(sum==1)
// 将该二进制位赋值为1
ret|=(sum<<i);
}
// 返回结果
return ret;
}
};
哈希方法
class Solution
{
public:
int singleNumber(vector<int>& nums)
{
// 定义一个哈希表
unordered_map<int, int> ump;
// 将每一个数按照<数,出现的次数>进行哈希映射
for (int num : nums)
{
ump[num]++;
}
int ans = 0;
// 遍历哈希表来求出只出现一次的数
for (auto& e : ump)
{
if (e.second == 1)
return e.first;
}
return 0;
}
};