找单身狗(C实现)_c语言单身狗题目-程序员宅基地

技术标签: c++  题目求解  

题目要求:
一个数组中只有两个数字是出现一次,其他所有数字都出现了两次。编写一个函数找出这两个只出现一次的数字。

这道题目主要是考察位运算符的应用
我们应该知道:

  1. 相同的两个数字 异或 结果为 0
  2. 任何数 按位与 1,可以判断最低位是 0 还是 1

整体思路:

数组所有数字进行 异或 求和,该 异或 求和 结果就是两个只出现一次的数字 异或 结果。我们根据 异或 求和 结果找到 从低位到高位 首次出现 1 的位置 。根据该位置,将两个数字分成两组数字(该位置为 0,该位置为 1),这样他们所在的一组数字除了这个数字自己以外都是出现两次。两组数字 异或 求和 就可以求得这两个数字。

第一步:

将整个数组的数字 异或 取和,结果就是数组中两个只出现一次的数 异或 的结果

在这里插入图片描述代码实现:

int i = 0;
	int ret = 0;
	//把数组num[]中所有数字进行异或。得到不同的两个数字的异或结果
	for (i = 0; i < sz; i++)
	{
    
		ret = ret ^ num[1];
	}

第二步

我们寻找从低位到高位首次出现 1 的位置。
代码实现:

//寻找异或结果二进制位中从低开始首次出现1的位置,并记录在pos中
	int pos = 0;
	for (pos = 0; pos < 32; pos++)
	{
    
		if (((ret >> pos) & 1) == 1)
		{
    
			break;
		}
	}

第三步

pos 是1 还是 0 分为两组,分别进行 异或 求和运算
代码实现:

for (i = 0; i < sz; i++)
	{
    
		//第pos位为1进行异或
		if (((num[i] >> pos) & 1) == 1)
		{
    
			n[1] ^= num[i];
		}
		//第pos位为0进行异或
		else
		{
    
			n[0] ^= num[i];
		}
	}

pos 为 1 的一组 异或 求和 结果存放在 n[1] 中; pos 为 0 的一组 异或 求和 结果存放在 n[0] 中。这样就可以将两个只出现一次的数字分开。
n[0] n[1] 即是只出现一次的两个数

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_45905158/article/details/109961235

智能推荐

【js】JavaScript手动回收垃圾_js手动触发gc-程序员宅基地

文章浏览阅读1.5w次,点赞2次,收藏5次。如何手动触发 JavaScript 垃圾回收行为?垃圾回收,即 garbage collect,简称 “GC”。这里的 “手动” 指有效地、显式地、可控地触发浏览器 JavaScript 引擎的垃圾回收行为,比如通过点击页面中的按钮来调用 JS 方法,或使用浏览器提供的功能。IEIE 实际上提供了一个未公开的 JS 方法 CollectGarbage()。至少在 I_js手动触发gc

深入理解海量日志收集利器 Flume_flume海量日志聚合-程序员宅基地

文章浏览阅读2.6k次。一、Flume是什么  Flume是一个分布式、可靠、和高可用的海量日志聚合的系统,支持在系统中定制各类数据发送方,用于收集数据;同时,Flume提供对数据进行简单处理,并写到各种数据接受方(可定制)的能力。二 、Fulme 有什么特点Fulme 特点如下: 1、可靠性  当节点出现故障时,日志能够被传送到其他节点上而不会丢失。Flume提供了三种级别的可靠性保障,从强到弱依次分别为:end-to_flume海量日志聚合

说说ios原生和H5交互_h5和ios交互,判断ios还是安卓的具体代码-程序员宅基地

文章浏览阅读353次。公司项目需要用到ios原生和JS交互,所以要用到WKWebView。使用很简单,下面我贴出几幅截图(列子是通过js触发后调用ios原生方法)导入WebKit,并遵守协议开始创建WKWebView和WKWebView的配置类WKWebViewConfiguration、WKUserContentController代理方法最后remove一下,_h5和ios交互,判断ios还是安卓的具体代码

Ubuntu镜像下载(清华镜像)-程序员宅基地

文章浏览阅读6.9k次,点赞6次,收藏19次。ubuntu镜像,清华镜像_ubuntu镜像下载

uniapp--支付宝支付/用户信息授权_uniapp h5获取支付宝授权-程序员宅基地

文章浏览阅读608次。uniapp 支付宝小程序拉起收银台 h5拉起收银台 授权 获取code _uniapp h5获取支付宝授权

ehcache 使用说明_withevictionadvisor-程序员宅基地

文章浏览阅读463次。ehcache 使用说明_withevictionadvisor

随便推点

Isolation Forest算法实现详解_compute_path_length功能-程序员宅基地

文章浏览阅读1.5w次,点赞19次,收藏54次。本文算法完整实现源码已开源至本人的GitHub(如果对你有帮助,请给一个 star ),参看其中的 iforest 包下的 IForest 和 ITree 两个类: https://github.com/JeemyJohn/AnomalyDetection前言 本文介绍的 Isolation Forest 算法原理请参看我的博客:Isolation Forest异常检测算法原理详解,本文_compute_path_length功能

Android x86安装教程-程序员宅基地

文章浏览阅读2.4w次,点赞7次,收藏21次。Android Studio里SDK原生的Android模拟器不支持蓝牙,Android x86支持蓝牙。下载工具1、VirtualBox2、Android x86参考:Android x86安装详细教程_android x86安装教程

tomcat端口冲突问题_tomcat端口冲突怎么解决-程序员宅基地

文章浏览阅读1.1k次。问题:在本地启tomcat,报错严重: StandardServer.await: create[8080]:java.net.BindException: Address already in use: JVM_Bind原因:端口已被其他进程占用解决:1.找tomcat配置文件server.xml修改端口配置MyEclipse自带的tomcat的server.xml文件位置服务启动,原来是8005报错,改为9090就好了HTTP请求默认的本地ip端口80802.查看进程,该端口被_tomcat端口冲突怎么解决

Linux操作系统实用功能,简单易操作 头歌实验一_当前目录下新建一个新的文件(名称为newfile); 在当前目录下新建一个新的文件夹(名-程序员宅基地

文章浏览阅读5.3k次。2022头歌平台操作系统实验一实验(1):Linux操作系统基本使用实验(2):Linux之C编程入门文章目录2022头歌平台操作系统实验一前言一、Linux操作系统基本使用二、C编程入门1.C语言程序从源代码到二进制行程序需要经历如下四个步骤:2. gcc命令:3. gcc运用三、编程要求1.在当前目录下新建一个新的文件(名称为newfile);2.在当前目录下新建一个新的文件夹(名称为newdir);3.将newfile文件复制一份到newdir目录下并命名为newfileCpy。总结前言_当前目录下新建一个新的文件(名称为newfile); 在当前目录下新建一个新的文件夹(名

OSPF 路由重分发_路由重分布的作用-程序员宅基地

文章浏览阅读869次。OSPF路由重分发OSPF路由重分发的作用非成末梢区域区域类型表OSPF虚链路配置虚链路的规则及特点路由重分发指令配置OSPF路由重分发的作用在现实环境中,一个单一的IP路由协议是管理网络中IP路由的首选方案,但是,在企业环境中,网络中是存在多种路由协议的,如果想要这些网络都互连互通,就要至少有一台路由器运行多种路由协议来实现不同网络之间的通信。就需要使用今天介绍的路由重分发,那我们下面简单介绍一下路由重分发及相关的配置。路由重分发通常在那些负责从一个AS学习路由,然后向另一个AS广播的路由器进行配置_路由重分布的作用

RabbitMQ详解(六)------RabbitMQ可靠性投递_rabbitmq consumer tag-程序员宅基地

文章浏览阅读883次。一.RabbitMQ的可靠性投递1.MQ实现异步通信过程中,消息丢失或重复,可能导致业务数据不一致如何解决? ps:在解决问题之前,必须清楚可靠性只是问题的一方面,发送消息的效率同样是需要考虑的问题,而这两个因素无法兼得。如果在发送消息的每一个环节都采取相关措施来保证可靠性,势必会对消息的收发效率造成影响。会产生消息丢失的四个地方:1.从生产者到Broker,Broker未接收 可能原因:网络连接或者Broker的问题(硬盘故障、硬盘写满了)导致消息发送失败,但生产者..._rabbitmq consumer tag

推荐文章

热门文章

相关标签