[CareerCup] 5.7 Find Missing Integer 查找丢失的数
5.7 An array A contains all the integers from 0 to n, except for one number which is missing. In this problem, we cannot access an entire integer in A with a single operation. The elements of A are represented in binary, and the only operation we can use to access them is "fetch the jth bit of A[i]," which takes constant time. Write code to find the missing integer. Can you do it in 0(n) time?
这道题给我们一个0到n的数组,然后其中一个数丢失了,让我们找到这个数。一个比较容易想到的方法是先用高斯求和公式求出等差数列0到n的和,然后遍历数组求所有数字之和,那么差值就是结果。但是这个解法就没有用到高大上的位操作Bit Manipulation,也许也不是出题人想考察的方法。题目中说了所有的整型数都是以二进制数表示的,而且可以以O(1)的时间来访问任意一位,这也很明显的提示了我们用位操作。我们先来看一个n=13的例子,那么0到13的二进制数表示如下:
0000 0010 0100 0110
0000 0010 0100 0110
0001 0011 0101
0001 0011 0101
然后我们观察上面的数字的最低有效位Least Significant Bit (LSB),然后我们统计1和0的个数,我们可以得出一个规律,当n是奇数时,0和1的个数相等,当n是偶数时,0比1多一个。那么当我们移除一个数的话,就有下面四种情况:
|
N为偶数,0比1多一个 |
N为奇数,0和1个数相等 |
|
|
移除0 |
0和1个数相等 |
0比1个数少 |
|
移除1 |
0比1个数多 |
0比1个数多 |
从上表可以看出来我们比较LSB的1和0的个数就可以知道移除的是1还是0,只要0的个数小于等于1,就是移除0,若0的个数大于1,就是移除1.我们一旦知道最低有效位移除的值,那么把所有不符合要求的都去掉,然后再用相同方法来判断倒数第二低有效位,以此类推直到所有的数字都被移除了,具体过程参见如下,当n=13,且移除了一个数:
0000 0010 0100 0110
0000 0010 0100 0110
0001 0011 0101
------ 0011 0101
那么我们来统计最低有效位的0和1的个数,发现0比1个数多,由此我们知道移除的数的最低有效位是1,那么我们把所有最低有效位是0的数都去掉:
00000 00100 01000 01100
0001 0011 0101 0111
00010 00110 01010
------ 0011 0101
我们再来统计倒数第二低有效位的0和1的个数,我们发现0比1个数多,那么移除数的倒数第二低有效位还是1,同样把其他的去掉:
00000 00100 01000 01100
00001 00101 01001 01101
00010 00110 01010
------ 0011 0111
我们再来统计倒数第三低有效位的0和1的个数,我们发现0比1个数相等,那么移除数的倒数第三低有效位是0,同样把其他的去掉,那么就只剩下一个了:
0011
那么倒数第四低有效位的0比1个数小,移除的是0,在把这个不是0的删掉,则数组为空了,我们就可以停止了,把所有移除的组合起来就得到0011,也就是最后的答案了,参见代码如下:
class Solution {
public:
int findMissing(vector<int> nums) {
return findMissing(nums, );
}
int findMissing(vector<int> nums, int col) {
if (nums.empty()) return ;
vector<int> oneBits, zeroBits;
for (auto &a : nums) {
if (fetch(a, col) == ) zeroBits.push_back(a);
else oneBits.push_back(a);
}
if (zeroBits.size() <= oneBits.size()) {
int v = findMissing(zeroBits, col + );
return (v << ) | ;
} else {
int v = findMissing(oneBits, col + );
return (v << ) | ;
}
}
int fetch(int n, int col) {
return n & (int)pow(, col);
}
};
[CareerCup] 5.7 Find Missing Integer 查找丢失的数的更多相关文章
- 寻找失踪的整数数组(Find the missing integer)
排列a包含N分子,其元素属于[0,N]之间,且不存在反复的元素.请你找出数组中缺失的元素(由于[0,N]之间有N+1个元素.而数组仅仅能存储N个元素.所以必定缺少一个元素).当中对数组的操作满足下列的 ...
- 算法---数组总结篇2——找丢失的数,找最大最小,前k大,第k小的数
一.如何找出数组中丢失的数 题目描述:给定一个由n-1个整数组成的未排序的数组序列,其原始都是1到n中的不同的整数,请写出一个寻找数组序列中缺失整数的线性时间算法 方法1:累加求和 时间复杂度是O(N ...
- 比赛--找丢失的数--解题报告T
找丢失的数 题目大意: There is a permutation without two numbers in it, and now you know what numbers the perm ...
- Unity3D查找丢失材质和脚本工具
笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,已出版书籍:<手把手教你架构3D游戏引擎>电子工业出版社和<Unity3D实战核心技术详解 ...
- LeetCode OJ:Missing Number (丢失的数)
Given an array containing n distinct numbers taken from 0, 1, 2, ..., n, find the one that is missin ...
- zookeeper logs is missing zookeeper 日志丢失
ERROR [main:QuorumPeerMain@85] - Invalid config, exiting abnormally Invalid config, exiting abnormal ...
- jquery dialog close icon missing 关闭图片丢失,样式丢失问题
http://stackoverflow.com/questions/17367736/jquery-ui-dialog-missing-close-icon
- Bestcoder BestCoder Round #28 A Missing number(查找缺失的合法数字)
Problem Description There is a permutation without two numbers in it, and now you know what numbers ...
- lintcode 中等题:find the missing number 寻找缺失的数
题目 寻找缺失的数 给出一个包含 0 .. N 中 N 个数的序列,找出0 .. N 中没有出现在序列中的那个数. 样例 N = 4 且序列为 [0, 1, 3] 时,缺失的数为2. 注意 可以改变序 ...
随机推荐
- css3相册图片3D旋转展示特效
查看效果:http://hovertree.com/texiao/css/14/ 本效果用css3的animation实现动画 定义和用法animation 属性是一个简写属性,用于设置六个动画属性: ...
- SuperMap iServer Ubuntu 开机自启动脚本
在/etc/init.d/文件夹里面设置相关的文件 1.为了保证创建文件的读写权限与默认一致,我们只需要cp一个默认的启动文件即可 2.删除iserver里面的所有信息 提示:直接执行“:1,$d” ...
- SharePoint项目实践中如何实现非打破继承看上去很美的权限控制
首先对于比较机密的数据,打破继承还是必须要的. 但是对于一些普通申请单据,虽然客户也希望用户不要看到其他人的申请单据,但是我还是不推荐打破继承,应为打破继承一方面会造成网站的权限管理特别的凌乱,另一方 ...
- Imperva WAF使用笔记
添加IP白名单 在对自己公司网站进行安全测试时会被WAF拦截,如果把WAF彻底停掉就无法拦截到外部的攻击了. 此时可以添加IP地址白名单,白名单内的IP对网站发起扫描时不会做拦截.
- 通过API执行AutoCAD命令来…
大家知道AutoCAD功能丰富,而更可贵的是,这么多丰富的功能背后都有一个命令,有些东西,直接用API调用写起来可能很费劲或者无法实现,可如果能用命令的话却很简单,这时候我们就可以通过API来调用Au ...
- jQuery初探 jQuery选取和操纵元素的特点
jQuery初探 jQuery选取和操纵元素的特点 JavaScript选取元素 先来看看不用jQuery的时候我们是怎么处理元素选取的. JavaScript选取元素的时候,可以根据id获取元素,当 ...
- android 很详细的序列化过程Parcelable
直接上代码:注释都写的很清楚了. public class Entry implements Parcelable{ public int userID; public String username ...
- 实用控件分享:自定义逼真相机光圈View
最近手机界开始流行双摄像头,大光圈功能也应用而生.所谓大光圈功能就是能够对照片进行后期重新对焦,其实现的原理主要是对拍照期间获取的深度图片与对焦无穷远的图像通过算法来实现重新对焦的效果. 在某双摄手机 ...
- 报文格式:xml 、定长报文、变长报文
目前接触到的报文格式有三种:xml .定长报文.变长报文 . 此处只做简单介绍,日后应该会深入学习到三者之间如何解析,再继续更新.——2016.9.23 XML XML 被设计用来传输和存储数据. H ...
- Oracle Linux(64位)安装64位Oracle10g遇到ins_ctx.mk问题
在Oracle Linux Server Release 5.7上安装64位Oracle 10g 时,遇到如下问题: Error in invoking target 'install' of mak ...