C语言在数组中寻找单身狗的问题(剑指offor)

发布时间:2024年01月15日

初级版:

数组中含有任意个元素,其中都无数个成双成对的元素,只有一个元素是单身狗。(问题:寻找出这个数组中一个的单身狗)

代码思路:通过将数组每一个元素进行进行异或,由于一个数据和自身异或,或一个数据和0异或的结果都等于0。从而得到没有对象的那个数字,在将那个数字赋值给一个变量。

#include <stdio.h>
int DanShenGou(int arr[], int sz)
{
	int i = 0;
	int pos = 0;
	for (i = 0; i < sz; i++)
	{
		pos ^= arr[i];//这一步是将arr数组中每一个元素都进行异或,从而寻找出单身狗
	}
	return pos;
}
int main()
{
	int arr[10] = { 1,2,3,4,5,1,2,3,4 };
	int sz = sizeof(arr) / sizeof(arr[0]);//求数组中的元素个数
	int ret=DanShenGou(arr, sz);
	printf("单生狗数字:%d\n", ret);
	return 0;
}

进阶版:

数组中含有任意个元素,其中都无数个成双成对的元素(其中含有一个偶数的单身狗也有一个奇数的单身狗),有两个元素是单身狗。(问题:寻找出这个数组中的两个单身狗)

代码思路:通过将数组每一个元素进行异或,由于一个数据和自身异或,或一个数据和0异或的结果都等于0。从而得到两个没有对象的元素,最后在将这两个元素进行异或,从而得到一个不为0的值,将该值赋给pos变量;再计算出pos变量的二进制数中哪一位含有1,创建一个变量ret保存该位数;然后将数组中每一个元素右移ret位再和1进行&操作,如果&1操作得到结果为1则该数是一个奇数,反之得到则该数是一个偶数,通过将数组分组成功后,最后将分组后的数组中每一个元

#include <stdio.h>
void DanShenGou(int arr[], int sz)
{
	int i = 0;
	int pos = 0;
	int ret = 0;
	int sum1 = 0;//用来装第一个单生狗
	int sum2 = 0;//用来装第二个单生狗
	for (i = 0; i < sz; i++)
	{
		pos ^= arr[i];//这一步是将arr数组中每一个元素都进行异或,从而寻找出两个单身狗
		              //然后将这个两个单生狗进行异或
	}
	for (i = 0; i < 32; i++)
	{
		if (((pos >> i) & 1) == 1)
		{
			ret = i;
			break;
		}
	}
	for (i = 0; i < sz; i++)
	{
		if (((arr[i] >> ret) & 1) == 1)
		{
			sum1^= arr[i];
			
		}
	}
	for (i = 0; i < sz; i++)
	{
		if (((arr[i] >> ret) & 1) == 0)
		{
			sum2 ^= arr[i];
		}
	}
	printf("单生狗数字:%d %d\n", sum1,sum2);


}
int main()
{
	int arr[10] = { 1,2,3,4,5,1,2,3,4,6 };
	int sz = sizeof(arr) / sizeof(arr[0]);//求数组中的元素个数
	DanShenGou(arr, sz);
	return 0;
}

素进行进行异或。

文章来源:https://blog.csdn.net/2302_79795375/article/details/135588837
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。