数组中数字出现的次数
题目要求
一个整型数组 nums 里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。
思路
以a ^ a = 0和0 ^ a = a这两个公式为基础,我们先异或数组中的所有元素,二进制的结果必定为单独两个数字的结果,将二进制选择一个为1的位,将数组总的元素和所对的位进行异或,结果为1分为一组,结果为0分为一组,这样分类注定会将两个单独的数字分到两个不同的组中,然后再对每组中的元素进行异或,每组剩下的值就是单独的数字。
代码实现
int* singleNumbers(int* nums, int numsSize, int* returnSize)
{
int *res = (int *)malloc(sizeof(int)* 2);
*returnSize = 2;
if (numsSize == 2)
{
return nums;
}
int s = 0;
for (int i = 0; i < numsSize; i++)
{
s ^= nums[i];
}
//n 是计数这两个数哪一位不同
int n = 0;
while ((s & 1) == 0)
{
s = s >> 1;
n++;
}
int s1 = 0;
int s2 = 0;
for (int i = 0; i < numsSize; i++)
{
if ((nums[i] >> n) & 1)
{
s1 ^= nums[i];
}
else
{
s2 ^= nums[i];
}
}
res[0] = s1;
res[1] = s2;
return res;
}