问题描述:
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现了三次。找出那个只出现了一次的元素。
问题分析:
这个题目与上个只出现一次的元素具有异曲同工之妙,上一题是其他所有元素都出现两次,我们可以用所有元素进行异或,因为只要是两个相同的元素,经过异或之后,两数相减,就会变成0,否则就是进行相加。
本题同样我们仍然采用位运算,我们先将所有十进制的数看成是二进制数(假设最长为32位),然后统计出所有二进制数字中从0位到第32位中1的个数,记作:sum,然后将sum对3取余得到结果tmp,剩下的这个结果tmp就是该位上需要保存的结果值。
注意:这个方法可以推广到n个相同元素找出唯一只出现一次的那个元素情况!!!
程序代码如下:
class Solution{
public:
int singleNumber(vector<int>& nums)
{
int res=0;
for(int i=0;i<32;i++)
{
int sum = 0;
for(int j=0;j<nums.size();j++)
{
sum+=(nums[j]>>i)&1;
}
res^= (sum%3)<<i;
}
return res;
}
};