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

目录

一:题目链接

二:题目思路

三:代码实现


一:题目链接

二:题目思路

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

相关推荐
liu****3 小时前
笔试强训(二)
开发语言·数据结构·c++·算法·哈希算法
艾菜籽3 小时前
Spring Web MVC入门补充1
java·后端·spring·mvc
失散133 小时前
分布式专题——44 ElasticSearch安装
java·分布式·elasticsearch·架构
无限进步_3 小时前
扫雷游戏的设计与实现:扫雷游戏3.0
c语言·开发语言·c++·后端·算法·游戏·游戏程序
qq_433554543 小时前
C++ 完全背包
开发语言·c++·算法
lingran__4 小时前
算法沉淀第二天(Catching the Krug)
c++·算法
MicrosoftReactor4 小时前
技术速递|使用 GitHub Copilot Agent 模式现代化 Java 项目的分步指南
java·github·copilot
ahauedu4 小时前
Spring Boot 2.7+ 中 RedisConnectionFactory Autowire 警告的深度解析
java·spring boot·后端