//给定一个整数数组,数组中有一个数出现了一次,其他数出现了三次,请找出只出现了一次的数。
//数据范围:数组大小满足1-10^5,数组中每个元素大小满足-2^31 - 2^31-1
//统计各个数的出现频率的方法
int singleNumber1(vector<int>& nums)
{
size_t length = nums.size();
unordered_map<int, int> buff(length);
for (size_t i = 0; i < length; i++)
{
++buff[nums[i]];
}
for (auto p : buff)
{
if (p.second == 1) return p.first;
}
return 0;
}
//位统计操作方法
int singleNumber(vector<int>& nums)
{
vector<int> bitPos(32, 0);//统计每个bit位出现了多少次
int result = 0;
for (size_t u = 0; u < nums.size(); ++u)
{
int num = nums[u];
//统计每个数不为0的bit位
for (int i = 0; i < 32; ++i)
{
if ((num & (1 << i)) != 0)
{
++bitPos[i];
}
}
}
for (int i = 0; i < 32; i++)
{
//如果该位出现的次数不为3的倍数,那么频数为1的值也有这个bit位
if (bitPos[i] % 3 != 0)
{
result += (1 << i);
}
}
return result;
}