编程之美(寻找丢失的数)

两个题目:

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

2、同样是n个数,其中有且仅有2个数出现奇数次,其余都出现偶数次。要求用线性时间常数空间找出出现奇数次的两个数。

首先知道这个公式就好办了,A^0 = A,A^A =0;

第一题:

int num = 0

 for(遍历所有的数){
num ^ = all[i]

}

        num就是出现一次的数

第二题:

       首先同方法1,得到C = A^B。A,B不等,那么结果不为0。那么二进制中肯定有1。可以先找到那个为1的一位,因为是异或那么可以知道为1的那个位置中,A,B中肯定有一个是0有一个是1。

      则这里可以处理为: 假定k是算出来的那个为1的位置上的数。

       for(遍历所有的数){
if(all[i] ^ k){

num_one  ^= all[i]

}

}

这样num_one就是A,B中的一个。

加入求出来的是A,则可以再用A^B^A求另外一个

    原文作者:gogo_li
    原文地址: https://blog.csdn.net/wsmbaw0707/article/details/53841164
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞