博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
位运算解决“一个数组中,只有一个数字出现n次,其他数字出现k次”问题
阅读量:4697 次
发布时间:2019-06-09

本文共 975 字,大约阅读时间需要 3 分钟。

转自:https://blog.csdn.net/monster_girl/article/details/52928864

在学习完位操作后,经常会遇到一类关于查找缺失整数的问题。

第一类是给你一个数组,告诉你这些数字的范围是什么,然后让你查找这个缺失的数字(例如无序数组的范围是从1到10,不重复的9个数)。
这类问题的解决方法比较多样,第一种,因为给定了范围可以通过计算数字总和值,然后分别减去这些数字,剩下的则是缺失的数字。第二种,对这个数组进行排序,遍历整个数组,然后判断相邻的元素是否连续,如果是,那缺失的数字则在两段;如果不连续,中间缺少的则是需要查找的。

第二类还是给你一个数组,然后这些数字都出现了偶数次,只有一个数字出现了奇数次,让你查找这个奇数次的数字,例如( 1, 2, 3, 4, 1, 2, 3)。

思路:通过一种运算,让相同的元素在进行运算后可以相互消除,最后剩下的元素则是寻找的元素。这种位运算就是“异或”。通过异或,相同的数所有位都是0,而单独的那个数则是它本身。

当题目条件发生改变,这个数组的数字可能出现了多次,但还是只有一个数字出现了一次,查找这个数字(假设在这里是出现了3次)。

思路:对于整数32位,对于每一位,整个数组的数加起来去除3的余数,就是在该元素在此位上的值。

总结:当一个数组有一个数恰好出现了k次,都可以用这个方法来解决。利用合适的位运算符将每一位保存,然后在找出这一位原来的数字。

第三类将难度又提升了,还是给你一个数组,里面的数字还是成对出现的,但单独出现的数字变成了两个,查找这两个数字。

思路:还是可以运用位运算的,将这个数组分成两部分,每一部分包含一个只出现一次的整数,这样子题目就和第二类差不多了。具体步骤是先对数组的每一个元素进行异或,得到的是两个数异或的结果,在这个结果中至少包含一个二进制位是1。

总结:任意选择一个二进制位,然后将数组分成两部分,其中一部分的末位是1,另一部分是0。由于这两个单独的数末位肯定不一样,所以分组后肯定不会在同一个组内。这个问题的解决思路就和上面比较相似了。

从上面的几个例子可以看出,查找缺失的数字主要是通过位运算符来抵消满足条件的元素

转载于:https://www.cnblogs.com/darlinFly/p/9545945.html

你可能感兴趣的文章
Erlang与ActionScript3采用JSON格式进行Socket通讯
查看>>
python数据类型--数字、字符串
查看>>
CentOS7使用firewalld打开关闭防火墙与端口
查看>>
OAuth2.0(基于django2.1.2实现版本)
查看>>
Servlet实现图片读取显示
查看>>
正则表达式去除括号的问题
查看>>
基于深度学习的目标检测研究进展
查看>>
【c++】字符串的冒泡排序【存疑,待查】
查看>>
ES6常用语法
查看>>
RabbitMQ环境搭建教程收集(待实践)
查看>>
Spring使用ComponentScan扫描Maven多模块工程的其它模块
查看>>
Jenkins环境拓扑及部署流程
查看>>
Servlet教程
查看>>
ThingsBoard
查看>>
hdu1024 Max Sum Plus Plus 滚动dp
查看>>
python的requests快速上手、高级用法和身份认证
查看>>
c# 整个工程(包括窗体工程)做成dll
查看>>
【转】Asp.Net MVC详解Controller之Filter
查看>>
牛客练习赛24 C PH试纸
查看>>
ERP通用附件管理功能设计与实现
查看>>