这道题目是这么回事
给定一组数据 有两个数据只会出现一次(单身狗) 其他数据都会出现两次
写一个函数 找到那两只单身狗
例:
输入 :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的分进另一个数组 就达到我们的目的了
最后是源码 想要将函数能够返回单身狗的数据 用指针传参就好了 这里只实现了打印功能 最后代码看起来好像很罗嗦 有更好的方法 欢迎在评论区留言