欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-03-22 21:35:10
...

问题描述:

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

问题分析:

1、先将所有数字异或,结果存在 ret 里;

2、找出 ret 二进制数第一位为 1 的位置,存在 pos 里;

3、通过 if (1 == ((a[i] >> pos) & 1)) 把两个不同的数分开;

4、两组分别进行异或,一组结果存在 first 里,另一组结果存在 second 里。

源代码:

#include<stdio.h>
#include<windows.h>

int find_num(int a[], int len)
{
	int i = 0;
	int ret = 0;//记录所有值异或的结果
	int pos = 0;//记录ret二进制为第一个为1的位置
	int first = 0;//将一组值异或存在first,得到1个没有相同数字的值
	int second = 0;//将另一组值异或存在second,得到另1个没有相同数字的值
	//先将所有数异或
	for (i; i < len; i++)
	{
		ret ^= a[i];
	}
	//找到ret二进制数第一个为1的数
	for (i = 0; i < 32; i++)
	{
		if (1 == ((ret >> i) & 1))
		{
			pos = i;
			break;
		}
	}
	//分组异或
	for (i = 0; i < len; i++)
	{
		if (1 == ((a[i] >> pos) & 1))
		{
			first ^= a[i];
		}
		else
		{
			second ^= a[i];
		}
	}
	printf("first = %d\nsecond = %d\n", first, second);
}

int main()
{
	int arr[8] = { 1, 2, 3, 4, 3, 2, 1, 5 };
	int len = sizeof(arr) / sizeof(arr[0]);
	find_num(arr, len);
	system("pause");
	return 0;
}

 

相关标签: C基础