leetcode-数组中数字出现的次数-2

数组中数字出现的次数

题目要求
  一个整型数组 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;
}

猜你喜欢

转载自blog.csdn.net/weixin_43580319/article/details/113100980
今日推荐