一个单身狗 和 两个单身狗

一个单身狗

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

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

方法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;
}
相关推荐
奔跑吧邓邓子12 小时前
【C语言实战(72)】C语言文件系统实战:解锁目录与磁盘IO的奥秘
c语言·文件系统·目录·开发实战·磁盘io
The Last.H13 小时前
Educational Codeforces Round 185 (Rated for Div. 2)A-C
c语言·c++·算法
松涛和鸣15 小时前
DAY20 Optimizing VS Code for C/C++ Development on Ubuntu
linux·c语言·开发语言·c++·嵌入式硬件·ubuntu
unclecss16 小时前
从 0 到 1 手写 Linux 调试器:ptrace 系统调用与断点原理
linux·运维·服务器·c语言·ptrace
fashion 道格16 小时前
从地图导航到数据结构:解锁带权有向图的邻接链表奥秘
c语言·数据结构·链表
猿大叔~17 小时前
面试必问!Linux 下 C/C++ 内存对齐深度解析:从底层原理到实战避坑
linux·c语言·面试
C++ 老炮儿的技术栈18 小时前
用密码学安全随机数生成256位密钥
c语言·开发语言·c++·windows·安全·密码学·visual studio
swibyn18 小时前
【无标题】
c语言·素数
口袋物联18 小时前
设计模式之单例模式在 C 语言中的应用(含 Linux 内核实例)
c语言·单例模式·设计模式
zore_c19 小时前
【C语言】数据在内存中的存储(超详解)
c语言·开发语言·数据结构·经验分享·笔记