一个单身狗 和 两个单身狗

一个单身狗

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

编写一个程序找出这个只出现一次的数字。

方法1(异或)

  • a ^ a = 0
  • a ^ 0 = a
  • ^满足结合律
c 复制代码
#include<stdio.h>
int main()
{
	int arr[] = { 1,2,3,4,5,4,2,3,5};
	int i = 0;
	int ret = 0;
	int sz = sizeof(arr) / sizeof(arr[0]);
	for (i = 0; i < sz; i++)
	{
		ret = ret ^ arr[i];
	}                      
	printf("单身狗:%d\n", ret);
	return 0;
}

方法2(暴力求解法)

c 复制代码
#include<stdio.h>
int main()
{
	int arr[] = { 1,2,3,4,5,4,2,3,5 };
	int i = 0;
	int sz = sizeof(arr) / sizeof(arr[0]);
	for (i = 0; i < sz; i++)
	{
		int count = 0;
		int j = 0;
		for (j = 0; j < sz; j++)
		{
			if (arr[i] == arr[j])
			{
				count++;
			}
		}
		if (1 == count)
		{
			printf("单身狗:%d\n", arr[i]);
			break;
		}
    }
	return 0;
}

两个单身狗

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

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

假设是1, 2, 3, 4, 5, 6, 4, 3, 2, 1

思路:只要是不同的数,异或后肯定有1,是1的那个二进制位不相同

所以我们可以把它们分成两组(按照5和6二进制某一位的不同)

十进制 二进制
5 101
6 110

比如:

拿最后一位分组:

1 1 3 3 5 (最后1位是1)

2 2 4 4 6 (最后1位是0)

拿倒数第二位分组:

1 1 4 4 5 (是0)

2 2 3 3 6 (是1)

过程:

1.全部异或在一起

2.计算第几位是1

3.分组

c 复制代码
#include<stdio.h>
void dog2(int arr[], int sz)
{
	int ret = 0;
	int i = 0;
	//1.全部异或在一起
	for (i = 0; i < sz; i++)
	{
		ret ^= arr[i];
	}
	//2.计算ret第几位是1,得到pos
	int pos = 0;
	for (i = 0; i < 32; i++)
	{
		if (((ret >> i) & 1) == 1)
		{
			pos = i;
			break;
		}
	}
	//3.分组
	int s1 = 0;
	int s2 = 0;
	for (i = 0; i < sz; i++)
	{
		if (((arr[i] >> pos) & 1) == 1)
			s1 ^= arr[i];
		else
			s2 ^= arr[i];
	}
	printf("单身狗1是%d\n单身狗2是%d", s1, s2);
}
int main()
{
	int arr[] = { 1,2,3,4,5,6,4,3,2,1 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	dog2(arr, sz);
	return 0;
}
相关推荐
青草地溪水旁5 分钟前
C/C++中的可变参数 (Variadic Arguments)函数机制
c语言·c++·可变参数
pusue_the_sun42 分钟前
C语言强化训练(12)
c语言·开发语言·算法
曙曙学编程1 小时前
stm32——寄存器操作,蜂鸣器原理
c语言·c++·stm32·单片机·嵌入式硬件
小徐不徐说2 小时前
数据结构基础之队列:数组/链表
c语言·数据结构·算法·链表·面试
l1t4 小时前
美团龙猫利用expat库实现的保存xml指定范围数据到csv的C程序
xml·c语言·解析器·expat
xxy.c7 小时前
嵌入式解谜日志—多路I/O复用
linux·运维·c语言·开发语言·前端
坠金7 小时前
CentOS安装或升级protoc
linux·c语言·开发语言
智者知已应修善业8 小时前
【51单片机8*8点阵显示箭头动画详细注释】2022-12-1
c语言·经验分享·笔记·嵌入式硬件·51单片机
极客小张11 小时前
【项目思路】基于STM32+ZigBee的智能家居--浴室场景设计
c语言·python·stm32·智能家居·课程设计·项目设计·企业项目
仰泳之鹅14 小时前
【C语言】深入理解指针(5)
c语言·开发语言