找出1到N中缺少的數?
《算法導論》中的練習題,
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中缺少的數?相关推荐
- 已知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; } ...
- 找出两个字符串中最大子字符串,如abractyeyt,dgdsaeactyey的最大子串为actyet
// 最大子字符串.cpp : 定义控制台应用程序的入口点. // //找出两个字符串中最大子字符串,如"abractyeyt","dgdsaeactyey"的 ...
- 找出两个字符串中最长的相同子字符串
//找出两个字符串中最长的相同子字符串public class Stringdemo {public static void main(String[] args) {String str1 = ne ...
- c语言:找出1到4000中,数字的各位数之和能被4整除的数有多少个?
找出1到4000中,数字的各位数之和能被4整除的数,如:745:7+4+5=16,16可以被4整除:28:2+8=10,10不能被4整除:745就是这样的特殊数字,而28不是,求:这样的数字共有多少个 ...
- 高效的找出两个List中的不同元素
转自同名博文,未知真正出处,望作者见谅 如题:有List<String> list1和List<String> list2,两个集合各有上万个元素,怎样取出两个集合中不同的元素 ...
- Excel 中如何找出两列数据中不重复的记录
现在有两列数据,要在 A 列中找出 B 列中没有的记录,在 B 列中找出 A 列中没有的记录.现在和大家分享一下这个方法. 我们先用一个简单的例子看一下.现在有两列数据,可以是分别在不同的数据单(sh ...
- 找出两列表的共有元素python_python 找出两个dataframe中不同的元素
pandas从Excel中读取数据,数据格式为dataframe格式 用for循环对进行两个列的数据比较想找出不同的元素时,发现数据是一样的,但是比较结果却是相同和不同的都存在(总之就是不是我以为的效 ...
- 汇编语言(十五)之找出两个数组中的相同元素
找出两个数组中的相同元素,并且输出 程序运行: 代码: datas segmentA dw -1,-2, 3, 4, 5, 6, 7, 8, 9, 10,-11, 12, 13, 14, 15ACou ...
- java基础—找出两个字符串中最大的子串
// 找一个字符串的最大子串public static void main(String[] args) {String s1 = "qwerabcdtyuiop";String ...
最新文章
- matlab中,怎样把矩阵中所有的0改为2
- 神策数据受邀参加全国 APP 个人信息保护监管会
- boost::hana::detail::type_foldr1用法的测试程序
- 对springMVC的简单理解
- matlab 神经网络设计多层隐含层_数据预测之BP神经网络具体应用以及matlab代码
- db h2 数据类型_H2Database数据类型
- 数据处理-Batch Normalization
- mysql killed状态连接_MySQL: kill connection的实现简析
- [导入]网易娱乐频道也在用风讯CMS
- java 修改最大nio连接数_携程基于Quasar协程的NIO实践
- 刷《剑指offer》笔记
- 从2000年到2019年
- java 类变量 赋值_Java 中类变量,实例变量,局部变量的赋值
- 2021年中国云无线接入网(C-RAN)市场趋势报告、技术动态创新及2027年市场预测
- linux+gpio+嵌入式,嵌入式Linux系统中对GPIO操作的方法总结
- JavaScript高级程序设计第四版
- Vivado HLS教程
- 万科java_万科面试总结
- 机器学习——概率模型
- java中 是什么意思_java中?:是什么意思
热门文章
- 网际控制报文协议ICMP(Internet Control Message Protocol)(详解)
- 天池 在线编程 最小的行程(动态规划)
- LeetCode 256. 粉刷房子(DP)
- LeetCode 243. 最短单词距离
- LeetCode 929. 独特的电子邮件地址
- LeetCode 274. H指数(排序,哈希)
- java检查两个字符串是否包含,java判断一个字符串是否包含另外一个字符串,java另外一个,要检查一个字符串是否包含...
- 学生成绩统计c语言课程设计,学生成绩管理系统-C语言课程设计
- 多线程 流水线 java_Java Lock锁多线程中实现流水线任务
- 知乎招聘搜索算法实习生!邀你共建知乎搜索引擎!