解决|由浅入深,解决三道[只出现一次的数]!( 三 )
我们试想一下,如果我们先将元素分成两组,然后每组包含一个目标值,那么异或之后,每组得到一个目标值,那么我们不就将两个目标值求出了吗?
例: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
文章插图
题目代码:
【 解决|由浅入深,解决三道[只出现一次的数]!】
文章插图
通过上文,大家应该能把这几道题给揉碎了,快去打卡吧!
- 量子处理器|微软联手毕马威 借助Azure Quantum提供优化解决方案
- 3d|解决用户审美疲劳问题的办法
- 搜狐|施耐德电气在欧洲电力展推出面向未来电网的全生命周期管理解决方案
- 固态硬盘|电脑键盘洒了半杯水,客户教科书式的解决方式,把我直接看懵了!
- 新浪网|助力海南自贸港建设,易生支付重磅推出国际邮轮收单一体化解决方案
- 硬盘|Dell游戏本G3非常卡,难怪重装几次系统还没解决,问题出在了这!
- MIUI|不怕找不到停车场了!高德地图停车雷达来了:临停、公厕都能解决
- 解决方案|如何写好B2B客户案例?
- 外卖员|美团外卖员往麻辣烫里面撒尿?这是一个密封封条就能解决的问题
- 联想|私有化是联想困局的最佳解决方案?