yulu

算法-找数2

题目要求:给定一个数组,数组中的数都是两两出现的,只有1个数是只出现1次,找到这个数
思路分析:首先我们想到的方法可能是将数组遍历2次,然后找到数,遍历两次的时间复杂度为O(n^2)。显然当n比较大时,耗时是很严重的,接下来介绍一个很简单的方法。
由异或的原理我们可以知道,一个数异或自己永远为0,即 a ^ a = 0。因此,我们可以将整个数组异或一下,最后的结果即是只出现1次的数

拓展:假如给定的数组中有2个数只出现了1次,找到这两个数。
思路分析:第一种方法就是遍历2次数组了,第二种方法我们可以借用hash处理。这两种方法都比较简单,下面我们介绍第三种方法:这种方法利用了异或和二进制,思路如下:
我们可以将数组中的元素转换为二进制,因为在数组中有两个数只出现了一次,那这两个数在其二进制的某一位或者几位肯定会不同,那我们就可以将所有元素异或一遍得到的结果从右往左数第一个为1的那一位就是用来区分数组的位置,这样就将两个数分到了两个子数组中,然后再对子数组异或就得到了2个只出现2次的数。