位运算之妙用:识别独特数字(寻找单身狗)

2024-02-03 18:28

本文主要是介绍位运算之妙用:识别独特数字(寻找单身狗),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

找单身狗1

图解:

代码如下:

找单身狗2

图解:

代码如下:


寻找单身狗1

从数组中 的1 2 3 4 5 1 2 3 4 中找出没有另一个相同的数与其匹配的数

这个问题的原理是利用异或运算的性质。异或运算(XOR)是一种二进制运算,其特点是相同为0,不同为1。在这个问题中,数组arr中的所有元素都出现了两次,只有一个元素只出现了一次。通过异或运算,可以将出现两次的元素抵消掉,最后剩下的就是只出现一次的元素。

具体步骤如下:

  1. 初始化一个变量n为0,用于存储异或结果。
  2. 遍历数组arr,将每个元素与n进行异或运算,并将结果赋值给n。
  3. 遍历结束后,n的值就是只出现一次的元素。

  图解:

 代码如下:

//找单身狗1
int main()
{int n = 0;int arr[9] = { 1,2,3,4,5,1,2,3,4 };for (int i = 0; i < sizeof(arr)/sizeof(arr[0]); i++){n = n ^ arr[i];//任何数和0异或就得到自己,与自己异或则为0}printf("%d", n);

寻找单身狗2

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

编写一个函数找出这两个只出现一次的数字。

例如:

有数组的元素是:1,2,3,4,5,1,2,3,4,6

只有5和6只出现1次,要找出5和6.

        找出一个只出现过一次的数字的问题处理方法就是找一个数字把里面所有的数字都异或一遍,利用异或两次等于没异或的特点来处理。那么如果有两个数字都只出现了一次,那么如此得到的应该是两个数异或的结果。首先这个结果肯定不是0(要不然就全都配对了),所以里面一定至少一位是一。找出值为1的一位,以这一位的值将结果分为两组。例如1 2 3 4 1 2,异或完的结果应该是3^4得到的111,那么随便找一位就行了。例如找最低位,那么这一位是1的有1 3 1,是0的有2 4 2,由于是利用异或结果为1的某一位分的组,所以两个待查询数字一定分别在两组中。所以再找两个变量,分别异或两组数,即可找到这两个数。

图解:

代码如下:


//找单身狗2
//1 2 3 4 5 1 2 3 4 6//pnum1 和 pnum2 存储 你找到的这两个数据 n代表数组长度
void FindNum(int arr[], int len, int* pnum1, int* pnum2)
{//1.将整个数组异或起来,得到两个不同数字的异或结果 例如: 5^6int tmp = 0;for (int i = 0; i < len; i++){tmp ^= arr[i];}//2.找到tmp中,二进制为1的某一位k 0110 0111 0001int k = 0;for (int i = 0; i < 32; i++){if ((tmp >> i) & 1 != 0){k = i;break;}}//3、遍历数组 把每个数据 第K为上是1的,分到一个组进行异或//最终的值存储到 pnum1 或者 pnum2 当中*pnum1 = *pnum2 = 0;for (int i = 0; i < len; i++){if ((arr[i] >> k) & 1 != 0){//第k位是1*pnum1 ^= arr[i];}else{	//第k位是0*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 num1 = 0;int num2 = 0;;FindNum(arr, len, &num1, &num2);printf("%d %d", num1, num2);return 0;
}

希望对你有帮助!加油!

若您认为本文内容有益,请不吝赐予赞同并订阅,以便持续接收有价值的信息。衷心感谢您的关注和支持!

这篇关于位运算之妙用:识别独特数字(寻找单身狗)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/674994

相关文章

Java使用Spire.Barcode for Java实现条形码生成与识别

《Java使用Spire.BarcodeforJava实现条形码生成与识别》在现代商业和技术领域,条形码无处不在,本教程将引导您深入了解如何在您的Java项目中利用Spire.Barcodefor... 目录1. Spire.Barcode for Java 简介与环境配置2. 使用 Spire.Barco

如何正确识别一台POE交换机的好坏? 选购可靠的POE交换机注意事项

《如何正确识别一台POE交换机的好坏?选购可靠的POE交换机注意事项》POE技术已经历多年发展,广泛应用于安防监控和无线覆盖等领域,需求量大,但质量参差不齐,市场上POE交换机的品牌繁多,如何正确识... 目录生产标识1. 必须包含的信息2. 劣质设备的常见问题供电标准1. 正规的 POE 标准2. 劣质设

基于Python实现数字限制在指定范围内的五种方式

《基于Python实现数字限制在指定范围内的五种方式》在编程中,数字范围限制是常见需求,无论是游戏开发中的角色属性值、金融计算中的利率调整,还是传感器数据处理中的异常值过滤,都需要将数字控制在合理范围... 目录引言一、基础条件判断法二、数学运算巧解法三、装饰器模式法四、自定义类封装法五、NumPy数组处理

Python中图片与PDF识别文本(OCR)的全面指南

《Python中图片与PDF识别文本(OCR)的全面指南》在数据爆炸时代,80%的企业数据以非结构化形式存在,其中PDF和图像是最主要的载体,本文将深入探索Python中OCR技术如何将这些数字纸张转... 目录一、OCR技术核心原理二、python图像识别四大工具库1. Pytesseract - 经典O

Python基于微信OCR引擎实现高效图片文字识别

《Python基于微信OCR引擎实现高效图片文字识别》这篇文章主要为大家详细介绍了一款基于微信OCR引擎的图片文字识别桌面应用开发全过程,可以实现从图片拖拽识别到文字提取,感兴趣的小伙伴可以跟随小编一... 目录一、项目概述1.1 开发背景1.2 技术选型1.3 核心优势二、功能详解2.1 核心功能模块2.

Python验证码识别方式(使用pytesseract库)

《Python验证码识别方式(使用pytesseract库)》:本文主要介绍Python验证码识别方式(使用pytesseract库),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全... 目录1、安装Tesseract-OCR2、在python中使用3、本地图片识别4、结合playwrigh

C/C++中OpenCV 矩阵运算的实现

《C/C++中OpenCV矩阵运算的实现》本文主要介绍了C/C++中OpenCV矩阵运算的实现,包括基本算术运算(标量与矩阵)、矩阵乘法、转置、逆矩阵、行列式、迹、范数等操作,感兴趣的可以了解一下... 目录矩阵的创建与初始化创建矩阵访问矩阵元素基本的算术运算 ➕➖✖️➗矩阵与标量运算矩阵与矩阵运算 (逐元

使用Python和PaddleOCR实现图文识别的代码和步骤

《使用Python和PaddleOCR实现图文识别的代码和步骤》在当今数字化时代,图文识别技术的应用越来越广泛,如文档数字化、信息提取等,PaddleOCR是百度开源的一款强大的OCR工具包,它集成了... 目录一、引言二、环境准备2.1 安装 python2.2 安装 PaddlePaddle2.3 安装

Python位移操作和位运算的实现示例

《Python位移操作和位运算的实现示例》本文主要介绍了Python位移操作和位运算的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1. 位移操作1.1 左移操作 (<<)1.2 右移操作 (>>)注意事项:2. 位运算2.1

Python实现特殊字符判断并去掉非字母和数字的特殊字符

《Python实现特殊字符判断并去掉非字母和数字的特殊字符》在Python中,可以通过多种方法来判断字符串中是否包含非字母、数字的特殊字符,并将这些特殊字符去掉,本文为大家整理了一些常用的,希望对大家... 目录1. 使用正则表达式判断字符串中是否包含特殊字符去掉字符串中的特殊字符2. 使用 str.isa