解决|由浅入深,解决三道[只出现一次的数]!( 三 )


我们试想一下,如果我们先将元素分成两组,然后每组包含一个目标值,那么异或之后,每组得到一个目标值,那么我们不就将两个目标值求出了吗?
例:a,b,a,b,c,d,e,f,e,f分组后
A组:a, a , b, b, c异或得到 c
B组:e, e,f,f,d异或得到 d
原理懂了,那么我们应该依据什么规则对其进行分类呢?
c , d两个不同的数,那么二进制上必定有一位是不同的,那么我们就可以根据这一位(分组位)来将 c , d 分到两个组中,数组中的其他元素,要么在 A 组中,要么在 B 组中。
我们应该怎么得到分组位呢?
我们让 c , d 异或即可,异或运算就是对应位不同时得 1 ,异或之后值为 1 的其中一位则为我们分组。
例 001 ⊕100 = 101,我们可以用最右边的 1 或最左边的 1 做为分组位,数组元素中,若我们将最右边的 1 作为我们的分组位,最后一位为 0 的则进入 A 组,为 1 的进入 B 组。
那么我们应该怎么借助分组位进行分组呢?
我们处理 c , d 的异或值,可以仅保留异或值的分组位,其余位变为 0 ,例如 101 变成 001或 100
为什么要这么做呢?在第二题提到,我们可以根据 a & 1 来判断 a 的最后一位为 0 还是为 1,所以我们将 101 变成 001 之后,然后数组内的元素x & 001即可对 x 进行分组 。同样也可以 x & 100 进行分组.
那么我们如何才能仅保留分组位,其余位变为 0 呢?例 101 变为 001
我们可以利用 x & (-x) 来保留最右边的 1
解决|由浅入深,解决三道[只出现一次的数]!
文章插图
题目代码:
解决|由浅入深,解决三道[只出现一次的数]!
解决|由浅入深,解决三道[只出现一次的数]!
文章插图
通过上文,大家应该能把这几道题给揉碎了,快去打卡吧!