找到数组中唯一或者唯二的数

本文介绍了如何找到数组中唯一或唯二的数,提供了三种解题思路:1) 利用位运算,通过异或操作找出不同数据;2) 使用HashMap记录每个数据出现的次数;3) 暴力解法,双重循环。此外,还给出了类似习题,如找出字符串中出现次数最少的字符和只出现一次的数据等。
摘要由CSDN通过智能技术生成

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

最后的那一位不同,那么我们就用这一位做

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值