【C语言题】只有一个数字——找出单身狗(升级版)

目录

1.题目:

2.方法:

3.提示:


1.题目:

找单身狗(要求找出两个单身狗了

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

编写一个函数找出这两个只出现一次的数字。

例如:

有数组的元素是:1,2,3,4,5,1,2,3,4,6

只有5和6只出现1次,要找出5和6.

 

2.方法:

再看这道题之前,我们先来看看第一版的找单身狗,在一个数组中只有一个单身狗

学会了这种思路,在做这种难度升级的版本。

#include 
int find_singal_dog(int arr[], int sz)
{
	//将所有数字异或(相同为0,相同的数字都异或为0了,那就会只剩下单身狗)
	int ret = 0;
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		ret = ret ^ arr[i];
	}
	return ret;
}
int main()
{
	int arr[] = { 1,2,3,4,5,1,2,3,4 };
	int sz = sizeof(arr) / sizeof(arr[0]);

	int t = find_singal_dog(arr, sz);
	printf("单身狗是:%d\n", t);
	return 0;
}

接下来就来理解一个数组中存在两个单身狗的操作吧

1.0在函数中打印(将数组分为两组  找各组的单身狗)

#include 
void find_singal_dog(int arr[], int sz)
{
	//将所有数字异或(相同为0)
	int ret = 0;
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		ret = ret ^ arr[i];
	}
	//计算ret二进制中哪一位为1
	int pos = 0;
	for (i = 0; i < 32; i++)
	{
		if (((ret >> i) & 1) == 1)
		{
			pos = i;
			break;
		}
	}
	//分组异或
	int x = 0;
	int y = 0;
	for (i = 0; i < sz; i++)
	{
		if (((arr[i] >> pos) & 1) == 1)
		{
			x ^= arr[i];
		}
		else
		{
			y ^= arr[i];
		}
	}
	printf("单身狗是:%d %d\n", x, y);
}

int main()
{
	int arr[] = { 1,2,3,4,5,1,2,3,4,6};
	int sz = sizeof(arr) / sizeof(arr[0]);
	//找单身狗的函数
	find_singal_dog(arr, sz);
	return 0;
}

2.0带回main函数打印

#include 
void find_singal_dog(int arr[], int sz,int *x,int *y)
{
	//将所有数字异或(相同为0)
	int ret = 0;
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		ret = ret ^ arr[i];
	}
	//计算ret二进制中哪一位为1
	int pos = 0;
	for (i = 0; i < 32; i++)
	{
		if (((ret >> i) & 1) == 1)
		{
			pos = i;
			break;
		}
	}
	//分组异或
	int x = 0;
	int y = 0;
	for (i = 0; i < sz; i++)
	{
		if (((arr[i] >> pos) & 1) == 1)
		{
			*x ^= arr[i];
		}
		else
		{
			*y ^= arr[i];
		}
	}
}

int main()
{
	int arr[] = { 1,2,3,4,5,1,2,3,4,6 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	//找单身狗的函数
	int x = 0;
	int y = 0;

	find_singal_dog(arr, sz,&x,&y);
	printf("单身狗是:%d %d\n", x, y);
	return 0;

 

3.提示:

(1)合理巧妙使用按位异或(^)

(2)学会举一反三

你可能感兴趣的:(C语言,c语言,开发语言)