当前位置: 首页 > news >正文

寻找单身狗

在一个数组中仅出现一次,其他数均出现两次,这个出现一次的数就被称为“单身狗“。

一.一个单身狗

我们知道异或运算操作符 ^ ,它的特点是对应二进制位相同为 0,相异为 1

由此我们容易知道两个相同的数,进行异或运算得到的结果一定为 0,0和非0数字异或的结果为非0数字,因此我们可以将数组中的所有元素都进行异或,出现过两次的数异或结果将为0,留下来的就是单身狗了。

代码实现:

int FindSingle(int* arr,int sz)
{int dog = 0;int i = 0;for (i = 0; i < sz; i++){dog ^= arr[i];}return dog;
}
int main()
{int arr[5] = { 1,4,2,1,2 };int sz = sizeof(arr) / sizeof(arr[0]);printf("单身狗为:%d\n", FindSingle(arr, sz));return 0;
}

二.两个单身狗

如果数列中存在两个单身狗,依然和上面一样全部进行异或运算显然是得不到答案的,相同的数通过异或消除了,得到的会是两个单身狗异或的结果。

能不能将两个单身狗分开,在两个数组中分别以上面的方式找出单身狗呢?

异或的条件是对应二进制位相同为 0,相异为 1。通过两个单身狗数异或的结果,我们可以得到两个单身狗数在某些二进制位上单身狗的值不同(0或1),可以通过这位上的值不同来将两个单身狗分开。

同样,对于出现过两次的非单身狗数,也可以通过判断某一二进制位相同,将其放入同一数组中,再对该数组进行异或运算后消除。

代码实现:

void FindSingle(int* arr, int sz,int* dog,int* dog1,int* dog2)
{int i = 0;for (i = 0; i < sz; i++){//全部异或得到两个单身狗的异或结果*dog ^= arr[i];}//两个单身狗数某二进制位上的值不同int pos = 0;for (i = 0; i < 4; i++){//dog的值为两个单身狗数异或的结果,dog的某一二进制位为1则代表两个单身狗在这一二进制位上不相等//找出这一位置并拷贝下来if (((*dog >> i) & 1) == 1){pos = i;break;}}//将数组按pos位上的值为1或0分组并求异或for (i = 0; i < sz; i++){if (((arr[i] >> pos) & 1) == 1){*dog1 ^= arr[i];}else{*dog2 ^= arr[i];}}
}
int main()
{int arr[10] = { 1,2,3,4,5,1,2,3,4,6 };int dog = 0;int dog1 = 0;int dog2 = 0;int sz = sizeof(arr) / sizeof(arr[0]);FindSingle(arr, sz, &dog, &dog1, &dog2);printf("单身狗1是:%d,单身狗2是:%d", dog1, dog2);return 0;
}

http://www.lryc.cn/news/174410.html

相关文章:

  • 【pytest】 allure 生成报告
  • 动态链接库搜索顺序
  • 【CAN、LIN通信的区分】
  • Redis环境配置
  • UG NX二次开发(C++)-采用std::vector对体对象的质心进行排序
  • 一点思考|关于「引领性研究」的一点感悟
  • 什么是HTTP/2?它与HTTP/1.1相比有什么改进?
  • IDEA
  • NSS [HXPCTF 2021]includer‘s revenge
  • 《动手学深度学习 Pytorch版》 7.1 深度卷积神经网络(AlexNet)
  • C++ - 双指针_盛水最多的容器
  • 分类预测 | Matlab实现NGO-CNN-SVM北方苍鹰算法优化卷积支持向量机分类预测
  • 分享一个java+springboot+vue校园电动车租赁系统(源码、调试、开题、lw)
  • 高性能计算环境下的深度学习异构集群建设与优化实践
  • Laravel框架 - Facade门面
  • 算法通关村第16关【青铜】| 滑动窗口思想
  • CentOS安装openjdk和elasticsearch
  • 【新版】系统架构设计师 - 案例分析 - 信息安全
  • 数据库设计(火车订票系统)
  • qemu+docker在服务器上搭建linux内核调试环境
  • Stable Diffusion 参数介绍及用法
  • 打印大对象日志导致GC问题的解决
  • 【Docker】学习笔记
  • 网易云信4K 8K RTC助力远程医疗的技术实践
  • 【排序算法】冒泡排序、插入排序、归并排序、希尔排序、选择排序、堆排序、快速排序
  • Linux学习笔记-应用层篇
  • MySQL数据库的存储引擎
  • Linux-多路转接-epoll
  • Java面试被问了几个简单的问题,却回答的不是很好
  • 概率论几种易混淆的形式