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

两个题目:

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求另外一个


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值