排列a包含N分子,其元素属于[0,N]之间,且不存在反复的元素。请你找出数组中缺失的元素(由于[0,N]之间有N+1个元素。而数组仅仅能存储N个元素。所以必定缺少一个元素)。当中对数组的操作满足下列的条件:不能在常数时间内读取数组中的元素,可是可以读取数组中元素的某一个bit值。可以在常数时间内交换数组的两个元素的位置。请设计一种算法使其可以在线性时间内找出数组中缺失的元素。

(N=2^k)

An array a[] contains all of the integers from 0 to N, except 1. However, you cannot access an element with a single
operation. Instead, you can call get(i, k) which returns the kth bit of a[i] or you can call swap(i, j) which
swaps the ith and jth elements of a[]. Design an O(N) algorithm to find the missing integer. For simplicity, assume N is a power of 2

算法设计:有题设可知,[0,N]之间奇数和偶数个数之差等于1,假设缺失偶数,则奇数和偶数的数目相等,反之缺失奇数。

怎样推断元素的奇偶呢?题设给出仅仅能在常数时间内訪问数组元素的某个bit值。所以仅仅需看元素的最后一个bit为0还是1就可以。这样通过一次扫描数组能够排除n/2个元素。

利用此法(推断0,1个数的多少)我们就能够找出缺失的元素。反复上述操作就可以。

算法性能分析:

第一次扫面元素推断奇偶。须要循环n次。从而排除n/2个元素,因此第二次循环须要循环n/2次,一次类推。总共的循环次数为T

T=n+n/2+n/4+n/8+……+1=O(n)。为此达到了题目的要求。

算法实现:

void swap(int* a, int i, int j)
{
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
int get(int* a, int i, int k)
{
int res = a[i]>>k & 1;
return res;
}
int Find_the_missing_integer(int* a, int low, int high)
{
int res = 0;
int power = 1;
int count0 = 0;
int count1 = 0;
int n = high-low+1;
int pointer0 = 0;
int i=0;
while(n>0)
{
for(int j=low; j<=high;j++)
{
if(get(a,j,i) == 0)
{
count0++;
swap(a,j,pointer0);
pointer0++;
}
else
{
count1++;
}
}
if(count0>count1)
{
res = res + power*1;
low = pointer0;
n = count1;
}
else
{
res = res + power*0;
high = pointer0 - 1;
pointer0 = low;
n = count0;
}
power = power*2;
count0 = 0;
count1 = 0;
i++;
}
return res;
}

算法解释:find_the_missing_intger,函数中利用pointer记录最后一个元素的0还是1的分界点。然后每次都循环扫面满足我们要求的那一部分元素,直到终于没有元素位置。

測试代码:

#include <iostream>
using namespace std;
void swap(int* a, int i, int j);
int get(int* a, int i, int k);
int Find_the_missing_integer(int* a, int low, int high);
void main()
{
int a[]={1,2,3,4,5,6,7,0};
cout<<Find_the_missing_integer(a,0,7);
}

如果不清楚欢迎讨论。

版权声明:本文博客原创文章,博客,未经同意,不得转载。

寻找失踪的整数数组(Find the missing integer)的更多相关文章

  1. [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 thi ...

  2. 128 Longest Consecutive Sequence 一个无序整数数组中找到最长连续序列

    给定一个未排序的整数数组,找出最长连续序列的长度.例如,给出 [100, 4, 200, 1, 3, 2],这个最长的连续序列是 [1, 2, 3, 4].返回所求长度: 4.要求你的算法复杂度为 O ...

  3. 给一个整数数组,找到两个数使得他们的和等于一个给定的数 target。

    描述 给一个整数数组,找到两个数使得他们的和等于一个给定的数 target. 你需要实现的函数twoSum需要返回这两个数的下标, 并且第一个下标小于第二个下标.注意这里下标的范围是 0 到 n-1. ...

  4. 作业帮:给定一个整数数组,找出其中两个数相加等于目标值(去重set)

    题目描述 给定一个整数数组,找出其中两个数相加等于目标值 输入 [1,3,5,7,9,11] 10 输出 1,9 3,7 代码: import java.util.HashMap; import ja ...

  5. 给定一个整数数组 nums 和一个目标值 target,求nums和为target的两个数的下表

    这个是来自力扣上的一道c++算法题目: 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案 ...

  6. c语言经典算法——查找一个整数数组中第二大数

    题目: 实现一个函数,查找一个整数数组中第二大数. 算法思想: 设置两个变量max1和max2,用来保存最大数和第二大数,然后将数组剩余的数依次与这两个数比较,如果这个数a比max1大,则先将max1 ...

  7. 风口之下,猪都能飞。当今中国股市牛市,真可谓“错过等七年”。 给你一个回顾历史的机会,已知一支股票连续n天的价格走势,以长度为n的整数数组表示,

    转自:http://www.cnblogs.com/ranranblog/p/5845010.html 风口之下,猪都能飞.当今中国股市牛市,真可谓“错过等七年”. 给你一个回顾历史的机会,已知一支股 ...

  8. 【编程题目】一个整数数组,长度为 n,将其分为 m 份,使各份的和相等,求 m 的最大值★★ (自己没有做出来!!)

    45.雅虎(运算.矩阵): 2.一个整数数组,长度为 n,将其分为 m 份,使各份的和相等,求 m 的最大值 比如{3,2,4,3,6} 可以分成 {3,2,4,3,6} m=1; {3,6}{2,4 ...

  9. java—数组乘积输入: 一个长度为n的整数数组input 输出: 一个长度为n的数组result,满足result[i] = input数组中,除了input[i] 之外的所有数的乘积,不用考虑溢出例如 input {2, 3, 4, 5} output: {60, 40, 30, 24}

    /** * 小米关于小米笔试题 数组乘积输入: 一个长度为n的整数数组input 输出: 一个长度为n的数组result,满足result[i] = * input数组中,除了input[i] 之外的 ...

随机推荐

  1. C语言sendto()函数-经socket传送数据以及recvfrom函数《转》

    相关函数:send, sendmsg, recv, recvfrom, socket 头文件:#include <sys/types.h>   #include <sys/socke ...

  2. Selenium HtmlUnitDriver 多浏览器的支持

    1.HtmlUnitDriver WebDriver包括一个基于HtmlUnit的无界面实现,称为HtmlUnitDriver,即使用HtmlUnit时并不会打开真实的浏览器,而是在内存中执行代码,因 ...

  3. 在DLL动态链接库中封装VCL的MDI子窗体

    在DLL动态链接库中封装VCL的MDI子窗体不多说了,看代码就应该明白了,曾经我遇到的问题,现在放出来大家共享! 这里是工程文件的部分: 在DLL中封装MDI子窗体需要重写DLL入口函数,具体代码如下 ...

  4. OCA读书笔记(2) - 安装Oracle软件

    Objectives: •Describe your role as a database administrator (DBA) and explain typical tasks and tool ...

  5. 使用Material Design 创建App翻译系列----材料主题的使用(Using Material Theme)

    上一篇是使用Material Design 创建App翻译系列--開始学习篇,进入正题: 新的材料主题提供了下面内容: 1. 提供了同意设置颜色板的系统部件组件. 2. 为这些系统组件提供了触摸反馈动 ...

  6. 菜鸟版JAVA设计模式—从买房子看代理模式

    今天学习了代理模式. 相对于适配器模式,或者说装饰器模式,代理模式理解起来更加简单. 代理这个词应该比較好理解,取代去做就是代理. 比方,我们买卖房子,那么我们会找中介,我要卖房子,可是我们没有时间去 ...

  7. net析构函数对垃圾回收的影响

    net析构函数对垃圾回收的影响 之前忘了说了 代码都是在Release模式下运行的,现在补充上. 这里说析构函数,其实并不准确,应该叫Finalize函数,Finalize函数形式上和c++的析构函数 ...

  8. VC/MFC 在ListCtl 控件中随鼠标移动提示单元格信息

    BEGIN_MESSAGE_MAP(CTipListCtrl, CListCtrl) //{{AFX_MSG_MAP(CTipListCtrl) ON_WM_MOUSEMOVE() ON_WM_DES ...

  9. SVN权限解析规则详解(转)

    首先创建一个版本库后,会生成最初的目录结构和基本的配置文件,本文主要分析“authz”文件的内容:我们先抛开alias和groups不谈,将重点放在路径的权限配置上. 一. 权限格式 svn权限的基本 ...

  10. 这里的*号实际表示就是RAC中所有实例都使用

    您的位置: ITPUB个人空间 » cc59的个人空间 » 日志 发布新日志 我的日志我的足迹我的收藏 unix/linuxHA随笔backup&restoreperformance tuni ...