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

目录

一:题目链接

二:题目思路

三:代码实现


一:题目链接

二:题目思路

首先,我们可以通过将数组的元素一直 按位异或(^) 操作,就可以得到那两个只出现一次数字的 按位异或(^) 后的值 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,以这个为突破点分离两个只出现一次的数字。

相关推荐
小七在进步8 分钟前
C++入门(2)
java·jvm·c++
To0R13 分钟前
Agent 上线前必须过的五道门(附 Spring Boot 实现)
java
vipxieliang20 分钟前
固定电话验证详解:区号、号码、分机号的完整验证
java·spring boot
步行cgn28 分钟前
Spring Boot 主入口类上的 @Enable 和 @Scan 注解详解
java·spring boot·后端
lhldsg29 分钟前
全民健身解决方案软件开发实战:从架构设计到部署指南
java·前端·数据库·小程序
两点王爷31 分钟前
Java 与前端加载 MVT 数据:从服务端切片到浏览器渲染
java·前端·状态模式
en.en..36 分钟前
C语言核心解析:#define与typedef本质区别
开发语言·c++·算法
TinyMemory1 小时前
Java 面向对象核心入门(九):方法重写 Override|彻底分清重载与重写
java·面向对象·override·方法重写·重载与重写
LaughingZhu1 小时前
Product Hunt 每日热榜 | 2026-09-08
java·ide·深度学习·百度·intellij-idea
IT枫斗者枫哥1 小时前
Java 文件导出:写完了,为什么还不能标记成功?
java