看完就会——c语言之寻找单身狗

题目分为以下两种:

目录

1.只有一个单身狗

(1)关于异或

(2)代码实现

 2.有两个单身狗

 (1)分析

 (2)代码实现


1.只有一个单身狗

题目:

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

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

例如:

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

只有5出现了一次,我们要找出5

这里有两种解法,第一种是暴力求解法:即遍历数组的每一个元素记录元素的出现次数,出现次数为1次的即为我们要找的目标数字


这里我们详细介绍用异或的方法来寻找单身狗

(1)关于异或

(1)符号:^    异或是一种二进制的位运算

(2)运算规则:相同为0,相异为1

(3)任何一个整数异或0的结果都为它本身

(4)异或支持交换律:如3^5^3=5      3^3^5=5

通过上面的了解, 可以得知只要把数组的每个元素都异或一次,最后就会得到那个单身狗

分析:

(2)代码实现
#include<stdio.h>
int main()
{
	int arr[] = {1,2,3,4,5,1,2,3,4};
	int dog = 0;
	int sz = sizeof(arr) / sizeof(arr[0]);
	for (int i = 0; i < sz; i++)
	{
		dog ^= arr[i];
	}
	printf("单身狗 是%d", dog);
	return 0;
}

 2.有两个单身狗

题目:

这道题目依然可以用暴力求解的方法得到答案,但这里我们讨论另外一种方法


 (1)分析

第一步:把数组的所有元素都进行异或,最后得到5^6的结果

 第二步:

 (2)代码实现
#include<stdio.h>
void Find_single_dog(int arr[], int sz, int* px, int* py)
{
	int i = 0;
	int ret = 0;
    //数组元素全部异或在一起
	for (i = 0; i < sz; i++)
	{
		ret ^= arr[i];
	}
    //计算ret的第几位为1,得到i
	int pox = 0;
	for (i = 0; i < 32; i++)
	{
		if (((ret >> pox)&1) == 1)
		{
			pox == i;
			break;
		}
	}
	//分组
	for (i = 0; i < sz; i++)
	{
		if (((arr[i] >> pox )&1)== 1)
		{
			(*px) ^= arr[i];
		}
		else
		{
			(*py) ^= arr[i];
		}
	}
}
int main()
{
	int arr[] = { 1,2,3,4,5,1,2,3,4,6 };
	int x = 0;
	int y = 0;
	int sz = sizeof(arr) / sizeof(arr[0]);
	Find_single_dog(arr, sz, &x, &y);
	printf("单身狗是%d 和%d\n", x, y);
	return 0;
}

( 以上代码使用了^,&,| 操作符 来实现代码 )


(注意:这里是使用了返回型参数的方法带回两个值的)

  • 19
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 15
    评论
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT且66

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值