一个单身狗 和 两个单身狗

一个单身狗

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

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

方法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;
}
相关推荐
Dillon Dong31 分钟前
从C到SIMULINK: 字节/字偏移 + 位偏移实现故障与故障字保存操作
c语言·开发语言·c#
梁下轻语的秋缘36 分钟前
用 LoRa + W5500 做一个无线呼叫器
c语言·c++
疑惑的杰瑞1 小时前
【C】函数与数组
c语言·开发语言·算法·可变参数
superman超哥1 小时前
仓颉内存分配优化深度解析
c语言·开发语言·c++·python·仓颉
superman超哥1 小时前
仓颉代码内联策略深度解析
c语言·开发语言·c++·python·仓颉
Trouvaille ~1 小时前
【Linux】库制作与原理(一):静态库与动态库的制作使用
linux·运维·服务器·c语言·汇编·动静态库·编译链接
ghujlhdrx1 小时前
FOC电机驱动自学记录系列(前言)一些想法的碎碎念
c语言
渡我白衣1 小时前
计算机组成原理(9):零拓展与符号拓展
c语言·汇编·人工智能·嵌入式硬件·网络协议·硬件工程·c
一分之二~1 小时前
回溯算法--全排列
c语言·数据结构·c++·算法·leetcode
松涛和鸣1 小时前
DAY37 Getting Started with UDP Network Programming
linux·c语言·网络·单片机·网络协议·udp