n个数(0-9999)个数中有两个相同的数,找出这两个数

解题思路:首先需要了解如何从2n个数中找出两个不同的数,其他都是两两成对。

这个思路是将这2n个数两两异或 (logn),然后可以找出这两个不同的数异或的结果,我假定为res,将res进行如下操作:

res &~(res-1) //这个求出来的就是res为1的最低位

接下来需要将这2n个数进行分组,然后将每一组都进行异或操作(log(n/2)),这样就求出了这两个数。

有了上面的思路我们将20000个数进行异或操作:使用a[10000]数组来表示这10000个数{0,1,2,……a,a,……9998,9999}(注意:这也是10000个数,其中有一个数没有出现,另外一个数出现了两次),然后用b[10000]数组{0,1,2,……,9998,9999}表示0~9999,将这两个数组中的所有数据进行异或,得到的就是这两个不同的数之间的异或值了,然后采用上面的思路就可以得到结果这两个不同的数,再比较和sum(0,9999)的大小就能得出这个重复的值了
时间复杂度(log2n + log2n + logn)也即是logn的时间复杂度。

借鉴思路:如何从n个数中找出两个不同的数的算法,其他数都是两两成对

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值