对查找连续数段中缺失的一个数的想法
2008-11-11 12:26
399 查看
有一段数段,MIN到MAX,存储顺序为无序,但是其中缺失了一个数,如何查找出这个数呢?
可以用标志位的方法,但个人觉得这个方法不是很好
然后我就想到了XOR运算
XOR运算有个特点,凡是从偶数开始的连续4个数进行XOR运算后结果为0,那么,如果其中缺失一个数的话,XOR结果就应 该是这个数。XOR运算具有可交换性质。那么我就可以利用这一点,将数段扩充为4的倍数,使得数段中全是4个一段4个一段的。那么对这些数进行XOR运算后就可以得到那个缺失的数了。
伪代码如下:
const int MAX = 上限;
const int MIN = 下限;
int iResult = MAX + (4 - (MAX % 4));//结果
int Array[MAX-MIN] = {MIN到MAX的无序数集,缺一个};
//上限扩充
for(int i=(4 - (MAX % 4)); i>0; --i)
{
iResult ^= MAX + i;
}
//下限扩充
for(int j=(MIN % 4); j>0; --j)
{
iResult ^= MIN - j;
}
//求出结果
for(int ix=0; ix<(MAX-MIN); ++ix)
{
iResult ^= Array[ix];
}
iResult就是缺失那个数
可以用标志位的方法,但个人觉得这个方法不是很好
然后我就想到了XOR运算
XOR运算有个特点,凡是从偶数开始的连续4个数进行XOR运算后结果为0,那么,如果其中缺失一个数的话,XOR结果就应 该是这个数。XOR运算具有可交换性质。那么我就可以利用这一点,将数段扩充为4的倍数,使得数段中全是4个一段4个一段的。那么对这些数进行XOR运算后就可以得到那个缺失的数了。
伪代码如下:
const int MAX = 上限;
const int MIN = 下限;
int iResult = MAX + (4 - (MAX % 4));//结果
int Array[MAX-MIN] = {MIN到MAX的无序数集,缺一个};
//上限扩充
for(int i=(4 - (MAX % 4)); i>0; --i)
{
iResult ^= MAX + i;
}
//下限扩充
for(int j=(MIN % 4); j>0; --j)
{
iResult ^= MIN - j;
}
//求出结果
for(int ix=0; ix<(MAX-MIN); ++ix)
{
iResult ^= Array[ix];
}
iResult就是缺失那个数
相关文章推荐
- 查找正序排列的List中缺失的日期数据的一个算法
- 一组连续的数据,打乱次序后,随机取出某一个数字,用最简单的方法查找出取出的数字(求解)
- 编写一个程序,从标准输入中读取若干string对象并查找连续重复出现的单词。所谓连续重复出现的意思是:一个单词后面紧跟着这个单词本身。要求记录连续重复出现的最大次数以及对应的单词
- 关于连续的几个数中有一个数缺失并一次遍历找出的问题
- oracle 中查找不连续的数的最前一个值
- 查找一个数组中不连续0出现的个数
- 输入连续有序数组,数组中有一个数字丢失,二分查找
- “《编程珠玑》(第2版)第1章”:查找一个数列中缺失的一个整数
- 1-n个元素中查找缺失的一个数
- 一组连续的数据,打乱次序后,随机取出某一个数字,用最简单的方法查找出取出的数字(求解)
- 查找一个int数的二进制中连续最长的1开始出现的索引
- 【小米校招笔试】一个数组是由有序数组经过n次循环移动后所得,请你用最快速度查找某个元素位置
- 查找一个字段所处的数据库及表
- 一个C++程序员工作三年的一点想法
- 去除一个字符串的开头和结束部分的空格,中间有连续的两个或两个以上的空格,则保留一个空格
- 求一个字符串中连续出现次数最多的…
- 拆分出一个数组中的连续数字
- 面试题-查找一个数组是否存在数目大于一半的数
- 用java判断一个int数组是否连续
- 在一个循环有序的数组里查找特定值