1、找出数组中唯一或者唯二的数
解题思路1、位运算
因为对于异或运算有:相同为0不同为1,举例说明:
5 ---》0 1 0 1
11---》1 0 1 1
然后 5 XOR 10 = 1110
那么利用这个,因为数组中的数据一样的会存在两个(单的数据先不管),那么这些数据两两异或必然会是0,也就是:
a XOR a = 0
特别的:
0 XOR a = a
因此:
int first = 0; for(int i = 0;i < N;i++) first = first ^ data[i]; //那么如果异或结果是0,必然所有数据都是成对的 //如果异或结果是不等于0,且数据个数是奇数,那说明异或结果就是我们要求的那个数
如果有两个单数据的情况就比较麻烦了:
我们采取的策略如下:
假定有一组数据
1 2 3 4 5 6 7 5 4 3 2 1
第一步:同样是全部异或得到first
第二步:我们做一个flag,什么意思呢,因为其余数据都一样,但是有两个数据不一样,那么我们可以找出这两个数据在二进制的哪一位不一样(随便找一个就能区分了)!例如:
7-----> 111
6-----> 110
最后的那一位不同,那么我们就用这一位做