【位运算】找出数组中,只出现一次的两个数字

在给定的整型数组中,除了两个数字仅出现一次,其余数字都出现两次。通过利用异或运算的性质,可以在O(n)的时间复杂度和O(1)的空间复杂度下找出这两个数字。首先对所有元素进行异或,得到一个结果,然后根据该结果的某一位将数组分为两组,再分别进行异或,最终得出两个唯一出现的数字。
摘要由CSDN通过智能技术生成

题目:

一个整型数组里除了两个数字之外,其他的数字都出现了两次,请写程序找出这两个出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1).


分析:

由于限制了复杂度,所以要用异或运算来解,什么是异或?

首先,计算机1个字节是8位(1Byte=8bit);其次,异或运算是:两个输入相同时为0,不同则为1。


举例数组:

{2, 4, 3, 6, 3, 2, 5, 5}


核心思路:

1、数组中全部数据异或操作后,依次对数组中的每个元素进行异或(相同位为0,不同为1)操作,得到0000 0010。

2、倒数第二位是1,说明我们要找的那两个只出现一次的数字,倒数第二位是不同的。

3、下面根据每个数二进制倒数第二位是不是1来分成两组,倒数第二位为1的是{2, 3, 6, 3, 2},倒数第二位为0的是{4, 5, 5}。

4、接下来对这两个数组分别进行异或操作,剩下的数字就是只出现一次的数字。


代码:

public class FindOnceNum {

    public void find(int[] values) {

        if (Objects.isNull(values) || values.length < 2) {
            throw new RuntimeException("参数不正确&
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值