只出现一次的数字(位运算算法)

目录

一:题目链接

二:题目思路

三:代码实现


一:题目链接

二:题目思路

首先,我们可以通过将数组的元素一直 按位异或(^) 操作,就可以得到那两个只出现一次数字的 按位异或(^) 后的值 ret 。

之后,我们就要将这两个数字分离开来,怎么做呢?因为 ret & ( - ret) 得到 ret 二进制最低位出现的数字 1,再因为两个数字 按位异或 后不同的二进制位是 1,以这个为突破点,我们就可以继续操作。先看代码实现再解释后面:

三:代码实现

java 复制代码
        int ret = 0;
        for(int x : nums) {
            ret ^= x;
        }

        int k = ret & (-ret);

        int a = 0;
        int b = 0;
        for(int x : nums) {
            if((x & k) != 0) {
                a ^= x;
            }else {
                b ^= x;
            }
        } 
        return new int[]{a,b};

再定义 两个变量 a, b,再遍历一遍数组,因为数组其他元素都会出现两次。所以其中相同的元素会两次进入 a ^= x 或两次进入 b ^= x ,无影响。再结合上面所说的两个数字 按位异或 后不同的二进制位是 1,以这个为突破点分离两个只出现一次的数字。

相关推荐
谢亮_vipxieliang5 分钟前
泛型擦除、通配符与 PECS 一次讲透
java·面试
八解毒剂13 分钟前
【计组】中央处理器CPU
java·开发语言·计算机组成原理
乐迪信息1 小时前
港口船舶逆行怎么管?AI防爆摄像机搭载智能检测算法
大数据·人工智能·深度学习·算法·计算机视觉
打工仔折腾 AI1 小时前
工业场景下时序库与实时计算一体化架构选型实践对比
java·开发语言·后端·python·性能优化·架构·ai agent 实战
ZealSinger1 小时前
Java虚拟线程上线后瓶颈转移到哪看三层
java·开发语言·firefox
2601_961133281 小时前
盘立方软件指标文华期货公式下载
java
蜗牛互联网1 小时前
长任务多Agent共享文件系统的Manifest交接模式
java·人工智能·后端
Sirens.2 小时前
Java并发锁详解:六类锁策略与 synchronized 底层原理
java·前端·算法
和裕2 小时前
全纸结构重型纸箱能否满足 1 吨以上设备出口熏蒸豁免要求?通关合规性全解析
大数据·运维·网络·人工智能·算法
sunshine22 girl3 小时前
Java学习五 面向对象高级5 内部类1
java·学习