找单身狗。一个数组中只有两个数字出现一次,其他数字出现了两次,编写一个函数找出这两个只出现一次的数字

news/2024/12/4 19:40:38/

例:在{1 2 3 4 5 6 1 2 3 4}找出5和6

方法二:

设计思想:
    1.分组原理
    (1)将所有数字进行异或,相同数字异或为零,所以只会剩5^6,即为异或的结果xor_result
    (2)异或的结果xor_result按位与1,找出xor_result的二进制是从第几位开始有数字1
    (3)根据求出的1所在位置进行分组
     例如:{1,2,3,4,5,6,1,2,3,4}中,xor_result=3,二进制为011,那么可以从第0位或者第1位作为分组标准进行分组
     第0位:第一组:1,3,5,1,3    第二组:2,4,6,2,4
     第1位:第一组:2,3,6,2,3    第二组:1,4,5,1,4
    2.分组方式
    (1)将数组中的元素与xor_result相与,把相与为0和1的数字放在两个组中
    (2)对分别对两个组的元素再次异或,异或的结果就是只出现一次的数字
    即:假设按照第0位分组
     第一组:1^3^5^1^3=5
     第二组:2^4^6^2^4=6
    这样就能求出只出现一次的数字

优点与不足:

时间复杂度O(n),效率比方法一高

只能算出存在两个只出现一次的数字

方法一:

设计思想:

    设计两层循环遍历数组中的每一个元素。

    在内层循环中再次遍历数组,检查是否存在与当前元素相等的其他元素。

    如果存在相同元素,跳出内层循环,返回外循环继续检查下一个元素。如果不存在,那么说明当前元素只出现了一次,打印该这个元素,并将标志位 flag 设置为1。

优点与不足:

数组中存在0个、1个或多个只出现一次的数字可以被找到/提示

时间复杂度O(n^2)

void find_dog(int arr[], int length)
{int i = 0;int xor_result = 0;int tmp = 0;int num1 = 0;int num2 = 0;for ( i = 0; i < length; i++){xor_result ^= arr[i];}for ( i = 0; i < 32; i++){if (((xor_result >> i) & 1) == 1){tmp = i;break;}}for ( i = 0; i < length; i++){if (((arr[i] >> tmp) & 1) == 1){num1 ^= arr[i];}else{num2 ^= arr[i];}}printf("%d %d", num1, num2);方法一//int i = 0;//int j = 0;//int flag = 0;//判断是否存在只出现一次的情况,0不存在,1存在//for ( i = 0; i < length ; i++)//{//	for ( j = 0; j < length; j++)//	{//		//		if (i != j && arr[i] == arr[j])//			break;//	}//	if (j == length)//	{//		flag = 1;//		printf("%d\n", arr[i]);//	}//}//if (0 == flag)//{//	printf("不存在只出现一次的数字!\n");//}
}
int main()
{int arr[] = { 1,2,3,4,5,6,1,2,3,4 };int length = sizeof(arr) / sizeof(arr[0]);find_dog(arr, length);return 0;
}


http://www.ppmy.cn/news/1123024.html

相关文章

TLS/SSL(九) TLS1.2与TLS1.3中的ECDH协议

一 TLS1.2 与 TLS1.3 中的 ECDH 协议 TLS 1.3相比于TLS 1.2在性能和安全性有了很大的提升备注&#xff1a; 当前TLS1.2是主流,暂时关注1.2即可 国密TLS tls1.3 ① TLS1.2 通讯过程 说明&#xff1a; 需要wiresahrk分析报文加以赋证 ② FREAK攻击 客户端支持的很多安…

Docker 部署 Firefly III 服务

拉取最新版本的 Firefly III 镜像&#xff1a; $ sudo docker pull fireflyiii/core:latest在本地预先创建好 upload 和 export 目录, 用于映射 Firefly III 容器内的 /var/www/html/storage/upload 和 /var/www/html/storage/export 目录。 使用以下命令来运行 Firefly III …

go语言 rune 类型

ASCII 码只需要 7 bit 就能完整地表示&#xff0c;但只能表示英文字母在内的 128 个字符&#xff0c;为了表示世界上大部分的文字系统&#xff0c;发明了 Unicode &#xff0c;它是 ASCII 的超集&#xff0c;包含世界上书写系统中存在的所有字符&#xff0c;并且为每个代码分配…

点云从入门到精通技术详解100篇-机载 LiDAR 点云滤波及分类(中)

目录 3.2 研究区概况 3.3 两种滤波算法结果对比 3.4 结果评价 3.4.1 结果精度 3.4.2 结果对比

Linux学习笔记-应用层篇

1、Linux进程、线程概念/区别 Linux进程和线程是计算机系统中两种不同的资源分配和调度单位。 进程是计算机系统进行资源分配和调度的基本单位&#xff0c;也被认为是正在运行的程序。在面向线程的计算机结构中&#xff0c;进程是线程的容器。进程拥有独立的内存和系统资源&am…

openjdk和oracle jdk的区别

OpenJDK 和 Oracle JDK 都是 Java Development Kit (JDK) 的不同实现&#xff0c;用于开发和运行 Java 应用程序。它们有一些区别&#xff0c;但也有很多相似之处。以下是它们之间的主要区别&#xff1a; 开源性质&#xff1a; OpenJDK 是开源的&#xff0c;由一个社区维护和开…

Python_ithheima_第二阶段

第一章 01-初识对像 02 类的成员方法 03 类和对象 04 构造方法 05 魔术方法 06 封装 07 封装的课后练习题讲解 08 继承的基础语法 pass关键字的功能是“语法补全” 同名成员或方法&#xff0c;谁先来谁优先级高 09 复写父类成员和调用父类成员 10 变量的类型注解 11 函数和方法…

Python:Django框架的Hello wrold示例

Django是Python的目前很常用的web框架&#xff0c;遵循MVC设计模式。 以下介绍如何安装Django框架&#xff0c;并生成最简单的项目&#xff0c;输出Hello world。(开发工具VScode) 一、安装Django 在VScode终端控制台执行以下指令安装Django python install django 如果要查…