一个数组中只有两个数字是出现一次, 其他所有数字都出现了两次。 找出这两个只出现一次的数字,编程实现。

方法一:遍历,查找
定义一个标志flag,利用for循环嵌套遍历数组,若arr[i]=arr[j],i!=j,说明这个数字出现了两次,flag=1.

void Search1(int *arr, int len)
{
	int i;
	int j;
	int flag = 0;
	printf("只出现一次的两个数字:");
	for (i = 0; i < len; i++)
	{
		flag = 0;//为零表示数字只出现了一次
		for (j = 0; j < len;j++)
		{
			if (arr[j] == arr[i] && i != j)
			{
				flag = 1;
			}
		}
		if (0 == flag)
		{
			printf("%d ", arr[i]);
		}
	}
	printf("\n");
}

方法二:异或法
异或 ^ 零异或任何数字为数字本身,相同数字异或为0
// a b 为只出现一次的数字
第一步:将数组中所有数字异或一遍,最终num=a^b
第二步:寻找第一位出现1的地方,赋给pos
第三步:找出两个出现一次的数字

void Search(int *arr, int len,int *px,int *py)
{
	int i = 0;
	int x = 0;
	int pos = 0;
	int num = 0;
	for (i = 0; i < len; i++)
	{
		num = num^arr[i];
	}
	for (i = 0; i < 32; i++)
	{
		if (((num>>i)&1)==1)//7^6  111
		{                     //   110
			pos = i;
			break;
		}
	}
	for (i = 0; i < len; i++)
	{
		if (((arr[i]>>pos)&1)==1)
		{
			*px = *px^arr[i];
		}
		else
		{
			*py = *py^arr[i];
		} 
	}
	printf("%d %d\n", *px,*py);
}

测试

int main()
{
	int arr[] = { 1, 3, 5, 7, 3, 5, 1, 6 };
	int len = sizeof(arr) / sizeof(arr[0]);
	int n1 = 0;
	int n2 = 0;
	Search(arr, len,&n1,&n2);
	Search1(arr, len);
	system("pause");
	return 0;
}

结果
在这里插入图片描述

你可能感兴趣的:(C语言)