解题思路:首先需要了解如何从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的时间复杂度。