位运算解决“一个数组中,只有一个数字出现n次,其他数字出现k次”问题
转自: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。由于这两个单独的数末位肯定不一样,所以分组后肯定不会在同一个组内。这个问题的解决思路就和上面比较相似了。
从上面的几个例子可以看出,查找缺失的数字主要是通过位运算符来抵消满足条件的元素
位运算解决“一个数组中,只有一个数字出现n次,其他数字出现k次”问题的更多相关文章
- MATLAB一个数组中另一个数组的值
c = setdiff(a,b) 删掉素组a中数组b的元素 如:
- js中关于一个数组中最大、最小值以及它们的下标的输出的一种解决办法
今天在学习js中的数组时,遇到的输出一个数组中最大.最小值以及它们的下表,以下是自己的解决方法! <script type="text/javascript"> var ...
- C#实现如何判断一个数组中是否有重复的元素 返回一个数组升序排列后的位置信息--C#程序举例 求生欲很强的数据库 别跟我谈EF抵抗并发,敢问你到底会不会用EntityFramework
C#实现如何判断一个数组中是否有重复的元素 如何判断一个数组中是否有重复的元素 实现判断数组中是否包含有重复的元素方法 这里用C#代码给出实例 方法一:可以新建一个hashtable利用hasht ...
- C#中判断一个数组中是否存在某个数组值 及相关
声明:reference:http://www.cnblogs.com/icebutterfly/archive/2010/06/22/1762738.html:http://blog.csdn.ne ...
- C语言:一个数组中只有两个数字是出现一次
//1.一个数组中只有两个数字是出现一次, //其他所有数字都出现了两次. //找出这两个数字,编程实现.a //^=单独两个数的^结果 //单独出现的两个数不同位的标记 //position: ^结 ...
- 面试题-->写一个函数,返回一个数组中所有元素被第一个元素除的结果
package com.rui.test; import java.util.Random; /** * @author poseidon * @version 1.0 * @date:2015年10 ...
- JS案例之8——从一个数组中随机取数
近期项目中遇到一个需求,从一个列表中随机展示列表的部分内容,需求不大,JS也非常容易实现.主要是运用到了Math对象的random方法,和Array的splice方法. 思路是先新建一个数组,存放所有 ...
- 【leetcode】Merge Sorted Array(合并两个有序数组到其中一个数组中)
题目: Given two sorted integer arrays A and B, merge B into A as one sorted array. Note: You may assum ...
- 笔试题&面试题:找出一个数组中第m小的值并输出
题目:找出一个数组中第m小的值并输出. 代码: #include <stdio.h> int findm_min(int a[], int n, int m) //n代表数组长度,m代表找 ...
- 【C语言】在两个数成对出现的数组中找到一个单独的数。
//在两个数成对出现的数组中找到一个单独的数.比如{1,2,3.3,1,4.2},即找出4 #include <stdio.h> int find(int arr[], int len) ...
随机推荐
- PySpider的安装
使用 Pip 安装,命令如下 pip install pyspider 命令执行完毕即可安装成功. 常见错误: Windows 下可能会出现这样的错误提示:Command "python s ...
- mitmproxy修改二级代理
第一步 mitmweb --mode upstream:http://114.240.101.242:5672 -s server.py 第二步 def request(self, flow: mit ...
- 定时从linux获取信息放到windows上
环境:windows上代码路径下存放:WinSCP-5.13.8-Setup.exe 第一步:test.txt 拉取脚本的txt文本 解析:存放从linux路径下拉取所需源文件zyy_count. ...
- 利用简易爬虫完成一道基础CTF题
利用简易爬虫完成一道基础CTF题 声明:本文主要写给新手,侧重于表现使用爬虫爬取页面并提交数据的大致过程,所以没有对一些东西解释的很详细,比如表单,post,get方法,感兴趣的可以私信或评论给我.如 ...
- NSLock的一些使用
在多线程的编程环境中,锁的使用必不可少! 使用时,基本方法就是: [lock lock]; // 加锁 [obj yourMethod]; // 处理你的操作 [lock unlock]; // 解锁 ...
- C memcpy()用法
https://blog.csdn.net/qq_21792169/article/details/50561570
- 小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_4-2.微服务下登录检验解决方案 JWT讲解
笔记 2.微服务下登录检验解决方案 JWT讲解 简介:微服务下登录检验解决方案 JWT讲解 json wen token 1.JWT 是一个开放标准,它定义了一种用于简洁,自包含的用于通信双方 ...
- Collection Map Java数据结构
Collection Map 框架图 Collection 接口的接口 对象的集合 ├ List 子接口 按进入先后有序保存 可 ...
- mybatisplus
1.selectById 根据主键查询一个对象,如果没有查到,则返回null: GxySchoolDto isExist = gxySchoolMapper.selectById(schoolEnti ...
- 利用百度智能云结合Python体验图像识别(转载来自qylruirui)
https://blog.csdn.net/qylruirui/article/details/94992917 利用百度智能云结合Python体验图像识别只要注册了百度账号就可以轻松体验百度智能云中 ...