1.一个数字出现一次,其它数字出现两次:

        这是此类问题中最简单的。考虑到异或运算符^会把相同的位置为零,因此从第一个数字开始异或,最后得到的值就是出现一次的数字。

2.一个数字出现1次,其它数字出现N次:

        如果n为偶数就比较简单了,就和上述解法一样。但是当n为奇数时就不能用上述方法了,因为每个数会剩下一次。

        我们以其它数字出现3次为例。首先我们先不考虑这一个数,那么其它数字每一个二进制位出现的次数一定是3的整数倍。此时再加上出现一次的数,那么这个数在某一位如果是0,那么这一位的统计能被3整除,为1则不能。这样我们只需遍历数组记录每一位1出现的次数即可,如果该位出现的次数能被3整除则这个数在该位为0,反之为1。

        对于其它数字出现n次的情况也可以类比。

3.两个数字出现1次,其它数字出现2次:

        这时如果我们一起异或那么最后得到的会是这两个数字的异或结果,而且无法分解。那么如果能把这两个数字分开就好了。

        考虑到一样的数字每一位都相同,那么这两个数字异或至少有一位是1,我们找到一个异或结果为1的位(如果有多位为1挑选其中一个就行)。然后遍历数组,将该位是1的数字分到一组,剩下的分到另一组。然后每组进行全部元素的异或可以得到出现一次的数。

        判断某一位是否为1可以使用如下方式,假如一个数有八位,我们要判断其第3位是否为1,我们可以和0000 0100进行按位与,如果结果为0则该位是0,反之则是1。

4.两个数字出现1次,其它数字出现N次:

        还是以其它数字出现3次为例。

        1.先统计每一位1出现的次数,再查看被三整除的余数。挑选余数是1的一位,余数是1说明两个数一个在该位是1,另一个在该位是0。

        2.按上一步骤挑选的位置是0或1开始分组,0的为一组,1的为另一组。

        3.按照1个数字出现1次,其它数字出现3次的方式在这两组找结果。

5.一个数字出现2次,其它数字出现1次:

        这个题目看着与上述差不多,但是实际上无法使用异或的方式解决。目前来讲只能使用哈希来解决。如果是整数可以直接使用计数排序的方式,只不过这次我们只需要找到值为2的下标。