《算法導論》中的練習題,

n-1個元素的數組A,含有1到n之間的n-1個數,找出缺少的那個數?

要求:O(n)

解法一:

sum = n*(n+1)/2;

sum減掉A中的每個元素,剩下的就是要找的數。

解法二:

利用異或運算,x^x==0

xor = 1^2^...^n;

xor異或A中的每個元素,最後得到的就是所求。

解法三:

增加一個空位A[n-1],將A[i]移到A[ A[i] ],

题目升级:

缺失两个数,求出这两个数。

思想:

也是采用异或。

假设,缺失的数为s1和s2。则s1^s2=1^2^3.....^n^a[0]^a[1]^....a[n-3]。这个式子一目了然,无需多解释。

问题是如何通过这个式子求出s1与s2的值。只要能求出一个值,比如说s1,则s2=s1^(s1^s2)。

s1^s2的值必然不为0,则必然存在一位,s1与s2在此对应位不同。我们就可以按照此对应位是0或者1,将1-n分为两堆,将a[0]-a[n-3]分为两堆。

将该为为1的两堆数相异或就能求出缺失的一个数。

举个例子。1-7中缺失3,4。转化为二进制位:011和100。三位都不同,我们用最后一位来判别,将1-n和数组非为两堆。

则结果为:

标志位(最后一位) 1 0
1-n 1、3、5、7 2、4、6
a[0]-a[n-3] 1、5、7 2、6

用标志位为1的数进行异或

1^3^5^7^1^5^7=3。这样就求出了一个缺失数。

// in case find two missing numbers, here size is 2 less than the range n
void find_missing_number2 (int a[], int size, int& miss1, int& miss2)
{miss1 = 0;miss2 = 0;int number=0;for (int i=0;i<size;i++)number ^= ((i+1)^a[i]);number ^= (size+1);number ^= (size+2);    // now number will be miss1^miss2// find the binary 1 in numberint k = number - (number&(number-1));for (int i=0;i<size;i++) {if ( (i+1)&k )miss1 ^= (i+1);if ( a[i]&k )miss1 ^= a[i];}if ( (size+1) & k )miss1 ^= size+1;if ( (size+2) & k )miss1 ^= size+2;miss2 = number ^ miss1;
}

類似的問題:

1、1-1000放在含有1001个元素的数组中,只有唯一的一个元素值重复,其它均只出现一次。每个数组元素只能访问一次,设计一个算法,将它找出来;

不用辅助存储空间,能否设计一个算法实现?

2、给你n个数,其中有且仅有一个数出现了奇数次,其余的数都出现了偶数次。用线性时间常数空间找出出现了奇数次的那一个数。

3、给你n个数,其中有且仅有两个数出现了奇数次,其余的数都出现了偶数次。用线性时间常数空间找出出现了奇数次的那两个数。

转载于:https://www.cnblogs.com/prajna/archive/2013/02/25/2932807.html

找出1到N中缺少的數?相关推荐

  1. 已知2个整形数据a,b.不使用if,?:以及其他任何条件判断的语法,找出a跟b中数据的大者。

    已知2个整形数据a,b.不使用if,?:以及其他任何条件判断的语法,找出a跟b中数据的大者. 答案: int max(int a,int b) { return (a+b+abs(a-b))/2; } ...

  2. 找出两个字符串中最大子字符串,如abractyeyt,dgdsaeactyey的最大子串为actyet

    // 最大子字符串.cpp : 定义控制台应用程序的入口点. // //找出两个字符串中最大子字符串,如"abractyeyt","dgdsaeactyey"的 ...

  3. 找出两个字符串中最长的相同子字符串

    //找出两个字符串中最长的相同子字符串public class Stringdemo {public static void main(String[] args) {String str1 = ne ...

  4. c语言:找出1到4000中,数字的各位数之和能被4整除的数有多少个?

    找出1到4000中,数字的各位数之和能被4整除的数,如:745:7+4+5=16,16可以被4整除:28:2+8=10,10不能被4整除:745就是这样的特殊数字,而28不是,求:这样的数字共有多少个 ...

  5. 高效的找出两个List中的不同元素

    转自同名博文,未知真正出处,望作者见谅 如题:有List<String> list1和List<String> list2,两个集合各有上万个元素,怎样取出两个集合中不同的元素 ...

  6. Excel 中如何找出两列数据中不重复的记录

    现在有两列数据,要在 A 列中找出 B 列中没有的记录,在 B 列中找出 A 列中没有的记录.现在和大家分享一下这个方法. 我们先用一个简单的例子看一下.现在有两列数据,可以是分别在不同的数据单(sh ...

  7. 找出两列表的共有元素python_python 找出两个dataframe中不同的元素

    pandas从Excel中读取数据,数据格式为dataframe格式 用for循环对进行两个列的数据比较想找出不同的元素时,发现数据是一样的,但是比较结果却是相同和不同的都存在(总之就是不是我以为的效 ...

  8. 汇编语言(十五)之找出两个数组中的相同元素

    找出两个数组中的相同元素,并且输出 程序运行: 代码: datas segmentA dw -1,-2, 3, 4, 5, 6, 7, 8, 9, 10,-11, 12, 13, 14, 15ACou ...

  9. java基础—找出两个字符串中最大的子串

    // 找一个字符串的最大子串public static void main(String[] args) {String s1 = "qwerabcdtyuiop";String ...

最新文章

  1. matlab中,怎样把矩阵中所有的0改为2
  2. 神策数据受邀参加全国 APP 个人信息保护监管会
  3. boost::hana::detail::type_foldr1用法的测试程序
  4. 对springMVC的简单理解
  5. matlab 神经网络设计多层隐含层_数据预测之BP神经网络具体应用以及matlab代码
  6. db h2 数据类型_H2Database数据类型
  7. 数据处理-Batch Normalization
  8. mysql killed状态连接_MySQL: kill connection的实现简析
  9. [导入]网易娱乐频道也在用风讯CMS
  10. java 修改最大nio连接数_携程基于Quasar协程的NIO实践
  11. 刷《剑指offer》笔记
  12. 从2000年到2019年
  13. java 类变量 赋值_Java 中类变量,实例变量,局部变量的赋值
  14. 2021年中国云无线接入网(C-RAN)市场趋势报告、技术动态创新及2027年市场预测
  15. linux+gpio+嵌入式,嵌入式Linux系统中对GPIO操作的方法总结
  16. JavaScript高级程序设计第四版
  17. Vivado HLS教程
  18. 万科java_万科面试总结
  19. 机器学习——概率模型
  20. java中 是什么意思_java中?:是什么意思

热门文章

  1. 网际控制报文协议ICMP(Internet Control Message Protocol)(详解)
  2. 天池 在线编程 最小的行程(动态规划)
  3. LeetCode 256. 粉刷房子(DP)
  4. LeetCode 243. 最短单词距离
  5. LeetCode 929. 独特的电子邮件地址
  6. LeetCode 274. H指数(排序,哈希)
  7. java检查两个字符串是否包含,java判断一个字符串是否包含另外一个字符串,java另外一个,要检查一个字符串是否包含...
  8. 学生成绩统计c语言课程设计,学生成绩管理系统-C语言课程设计
  9. 多线程 流水线 java_Java Lock锁多线程中实现流水线任务
  10. 知乎招聘搜索算法实习生!邀你共建知乎搜索引擎!