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

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


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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值