链接: 数组中数字出现的次数2
这道题是前一次博客的另一个版本,想看上一个的链接在下面:
链接: 数组中数字出现的次数1
这道题与上道题不太一样的是这里出现的次数是3次还有1次的,所以异或的方法不太好整,我们可以另找方法。
我们想,既然这个数组里面只有一个数字是出现一次,其他是三次,那用一个数组把这些出现三次的数字,把他们每个二进制位统计并相加,会发现这个统计的数组中的每个位的数字都会是3的倍数,那如果又多了一个出现一次的数,那他某个二进制位上统计完加上去,会让这个数组里面某个位的数字变成模3余1,那么就可以找出这个数字为1的进制位,最后再用二进制的运算求出这个数字。总的来说:
统计出数组中的所有的数,从第1位到第32位进制位有多少个1,然后找到数组中模3余1的位数,就是这个出现一次的数字的二进制位为1的位数。
int singleNumber(int* nums, int numsSize){
//首先先统计,所以先开辟个数组
int arr[32] = {0};
for(int i = 0; i < numsSize; i++)
{
for(int j = 0; j < 32; j++)
{
if(((nums[i]>>j) & 1) == 1)
{
arr[j] += 1;
}
}
}
//看看哪一位是出现一次的
int n = 0;
for(int i = 0; i < 32; i++)
{
if((arr[i] % 3) == 1)
{
//判断一下是不是第0位为1的情况
if(i == 0)
{
n += 1;
}
else
{
n += pow(2, i);
}
}
}
return n;
}