找出数组中唯二出现一次的数

来源:互联网 发布:手机能安装windows xp 编辑:程序博客网 时间:2024/05/22 06:17

原题取自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的两组便可得出答案


我的代码在网站上的测试结果


0 0
原创粉丝点击