我来找两只单身狗

这道题目是这么回事

给定一组数据 有两个数据只会出现一次(单身狗) 其他数据都会出现两次

写一个函数 找到那两只单身狗

例:

        输入 :1 2 3 4 7 1 2 3 4 9

        输出:7 9

思路:

如果这组数据中只有一只单身狗 如 1 2 3 4 1 2 3 4 7

那么把所有数据异或起来 得到的结果就是 7  

( ^ 符号符合交换律 两个相同数据异或的结果为零 再异或上单身狗 就是单身狗本身)

有了这个前提 处理两只单身狗的方法可以由上面延伸

先将数据通过某个标准分为两组

每组的结构为 一只单身狗+若干对相同的数据

这样 将每组的数据分别异或 就能得到两只单身狗的数据了

那么要依据什么标准分组呢 这个分组的硬性标准 就是两只单身狗要分到不同的地方 

那就从两只狗的不同之处寻找标准 以例题中的数据操作

1 2 3 4 7 1 2 3 4 9 

将这组数据异或起来 得到的结果 就是7和9的异或

表示为二进制为 0111(7)^1001(9)   结果表示为二进制是 1110

但我们不能通过结果知道是7和9的异或 只能够知道 这两只单身狗的二进制的第 二、三、四位都不相同

因为按位异或的规则为相同为0 不同为1

那我们随便选取其中一位作为分组的依据 肯定能将两只单身狗分进不同的数组

其他数据因为两两相等 也是成对分进一个数组

分组标准的代码展示为

(arr[i]>>bit_num)&1

arr 是所有元素的数组 bit_num 是这两只单身狗的二进制不同位的位数 (在上面那个例子中bit_num 可以是2、3或4)

遍历初始数组 经过上面那个表达式 结果为1的分进一个数组 为0的分进另一个数组 就达到我们的目的了

最后是源码 想要将函数能够返回单身狗的数据 用指针传参就好了 这里只实现了打印功能 最后代码看起来好像很罗嗦 有更好的方法 欢迎在评论区留言

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值