对查找连续数段中缺失的一个数的想法

    有一段数段,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就是缺失那个数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值