首页 > 其他分享 >C语言 | 找出单身狗2代码实现【全网最详细】

C语言 | 找出单身狗2代码实现【全网最详细】

时间:2024-06-06 11:59:34浏览次数:24  
标签:arr 数字 int 代码 全网 C语言 异或 分组 单身

找出单身狗2的代码实现

一、单身狗1代码回顾

1.1 题目

有一个数组只有一个数字出现一次,其余数字都是成对出现的
编写一个函数找出只出现一次的数字。
例如: 有数组的元素是:1 2 3 4 5 1 2 3 4
其中5只出现了1次,要找出数字5。

1.2 代码实现思路

之前我们学习过按位异或 ^ 这个操作符,它的运算方式是:对应的二进制位,相同为0,不同为1,
所以我们可以得到 n ^ n = 0 , 0 ^ n = n,因此,我们可以将数组中的元素全部异或,得到的就是唯一一个只出现一次的数字。

1.3 代码实现:

//单身狗1
int find_num(int arr[], int n)
{
	int tmp = 0;
	int i = 0;
	for (i = 0; i < n; i++)
	{
		tmp ^= arr[i];
	}
	return tmp;
}
int main()
{
	int arr[] = { 1,2,3,4,5,1,2,3,4 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	int ret = find_num(arr,sz);
	printf("%d\n", ret);
	return 0;
}

二. 单身狗2

2.1题目

一个数组中只有两个数字是出现一次,其他所有数字都出现了两次。
编写一个函数找出这两个只出现一次的数字。
例如:
有数组的元素是:1,2,3,4,5,1,2,3,4,6 只有5和6只出现1次,要找出5和6.

2.2 代码实现的大思路

根据各个数字二进制形式第一位数字进行分组,二进制位为0的分为一组,二进制位为1的分为一组,,将数组中的数字进行分组,分组之后再分别进行组内的异或 ,得到的就是只出现一次的数字 5 和 6 ,见下图

分组方式:
在这里插入图片描述

在这里插入图片描述

2.3 分组的具体步骤

  1. 将数组中的数字全部异或,得到的就是5^6的结果,结果是0011,有两个对应位不同,说明按照这两位的任意一位都可以将5和6分开,这里按第一位进行分组
  2. 将数组中的数字依次进行右移,右移之后和1进行按位与&计算,按照第一个位置得出的结果为0或者1进行分组
  3. 分组好之后进行组内的异或,得到的就是数组中只出现了一次的两个数字

见下图,便于理解:
在这里插入图片描述

2.4 代码的实现

//单身狗2
void FindNum(int arr[], int n, int* pNum1, int* pNum2)
{
	//1.整体异或,异或的结果就是5^6的结果
	int tmp = 0;
	for (int i = 0; i < n; i++)
	{
		tmp ^= arr[i];
	}
	//2. 判断tmp哪一位是1
	int pos = -1;//判断是那个位置
	for (int i = 0; i < 32; i++)
	{
		if (((tmp >> i) & 1) == 1)
		{
			pos = i;//在第i位
			break;
		}
	}
	if (pos == -1)//如果没有为1的位
	{
		*pNum1 = -1;
		*pNum2 = -1;
		return;
	}
	for (int i = 0; i < n; i++)
	{
		if (((arr[i] >> pos) & 1) == 1)//右移pos位判断是否为1
		{
			*pNum1 ^= arr[i];
		}
		else
		{
			*pNum2 ^= arr[i];
		}
	}
}

int main()
{
	int arr[] = { 1,2,3,4,5,1,2,3,4,6 };
	int len = sizeof(arr) / sizeof(arr[0]);
	int ret1 = 0;
	int ret2 = 0;
	FindNum(arr, len, &ret1, &ret2);
	printf("%d %d\n", ret1, ret2);
	return 0;
}

有什么疑问可以私信哦,看完有收获的话动动小手点个赞吧!!!
在这里插入图片描述

标签:arr,数字,int,代码,全网,C语言,异或,分组,单身
From: https://blog.csdn.net/Origin_life/article/details/139494760

相关文章

  • static 在c语言中的价值
    1.概要static在c语言中的价值。static还有一个在文件内部使用有效的限制。如果在函数的外部,被static修饰的变量或者函数,是不可以在文件外部访问的,也就是说不同的文件中,被static修饰的函数或者变量是可以重名的。static的这个特性,在c++中显得有些鸡肋,但在c中的价值却很大,几......
  • 大模型网信办备案全网最详细说明(附附件)
    一、大模型算法备案的强制性二、生成式人工智能(大语言模型)安全评估要点三、大模型备案必备材料+重点说明四、大模型备案填报流程五、大模型备案时间成本对比六、备案建议附录、过程性材料一、大模型算法备案的强制性1、强制要求备案(1)《办法》第六条规定:利用生成式人工......
  • TCP通信——基于C语言连接
    设计两个程序分别作为服务器和客户端,互相进行连接服务器/*************************************************************************************************************************** filename: tcp_server.c* author :Dazz* date :2024/6/5* functio......
  • 完全指南:C语言学习资源汇总
    C语言是编程学习的基石,无论是为了职业发展还是个人兴趣,掌握C语言都是技术生涯的重要一步。为了帮助初学者和有经验的程序员更好地学习和深化对C语言的理解,我们汇总了一系列优秀的书籍和在线资源。这些资源将帮助你从基础知识到高级概念,全面掌握C语言。推荐书籍1.《C语言入门......
  • C语言数据结构实现-单链表表基本操作
    链表插入元素同顺序表一样,向链表中增添元素,根据添加位置不同,可分为以下3种情况:插入到链表的头部(头节点之后),作为首元节点;插入到链表中间的某个位置;插入到链表的最末端,作为链表中最后一个数据元素;虽然新元素的插入位置不固定,但是链表插入元素的思想是固定的,只需做以下两步操......
  • 基于调用C语言作为reference_model的UVM对全加器的验证
    代码来自于,本篇文章只对其中的细节做探讨UVM的基本教程-CSDN博客首先DUT为加法器,但是舒服不仅是加数和被加数,还有ready和valid,输出也不止是和,还有valid和ready。valid代表数据有效,ready表示已经准备好发送或者接收。加法器的设计语言中,共有三个状态,INITIAL/WAIT/SEND,rst为1......
  • 基于c语言的UDP客户端、服务端二合一基础代码
    基于c语言的UDP客户端、服务端二合一基础代码示意图:准备好了吗,以下是基础代码:/****************************************************************************************************************************************字节序:数据以字节流的方式进行传输,底层都是......
  • 基于c语言的TCP客户端、服务端基础代码
    基于c语言的TCP客户端、服务端基础代码基本流程:客户端:#include<sys/socket.h>#include<netinet/in.h>#include<arpa/inet.h>#include<stdio.h>#include<errno.h>#include<sys/socket.h>#include<netinet/in.h>#include<netinet/......
  • 初识C语言(03)—学习笔记
    常见关键字C语言提供了丰富的关键字,这些关键字都是语言本身预先设定好的,用户自己是不能创造关键字的。归类下面是按照关键字的用途不同进行的归类变量的命名规则有意义,例如intage;floatsalary;等名字必须是字母、数字、下划线组成,不能有特殊字符,同时不能以数字......
  • C语言排序
    一、排序的运用生活中排序随处可见,比如我们高考时的排名,大学学校水平的排名等,打开京东,可以发现每样商品按照不同的方式排序,比如综合,销量,价格。其内部需要排序代码来完成。二、常见的排序算法一、交换排序一、冒泡排序冒泡排序是一种最容易想到的排序,但是其效率不高,没有实......