原题取自https://leetcode.com/problems/single-number-iii/?tab=Description
题目要求找出数组中唯二出现一次的数,其余数均只出现两次。 要求做到算法的时间复杂度为O(n)
解题最直接的方法是计算出数组中每个数出现的次数,然后取其中出现一次的,但其算法复杂度不满足题目要求
这里采用异或计算的方法来求解
由于 A ^A = 0,,A ^ 0 = A,
假设A、B就是题解,则 temp1 = A ^ B,
在二进制下,temp1的每一位1表示A和B在该位不相同,我们利用temp1中的第一位1将数组分成两组,一组包含A,而另一组包含B
最后对每组数进行异或计算求出A,B
代码如下:
temp1 -1 表示将temp1从最后一位到第一位1为止按位取反,假设这个1在第k位,
则temp1 & (temp1 - 1) 表示一个第k位为0,其余位与temp1相同的数
再与temp1进行异或计算,由于temp1在第k为1,
temp2 = b000……010……0,除了第k位为1外其余位均为0
利用temp2将数组分成第k为0和1的两组便可得出答案
我的代码在网站上的测试结果