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

目录

一:题目链接

二:题目思路

三:代码实现


一:题目链接

二:题目思路

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

相关推荐
To_OC6 小时前
LC 994 腐烂的橘子:人人都说是 BFS 入门题,我却写了三遍才过
javascript·算法·leetcode
金銀銅鐵9 小时前
[Python] 扩展欧几里得算法
python·数学·算法
狼爷9 小时前
吃透 Java Function 接口,搞定 99% 的 Stream 场景
java·函数式编程
To_OC12 小时前
LC 200 岛屿数量:经典 DFS 入门题,我第一次写居然连方向都搞错了
javascript·算法·leetcode
祎雪双十Gy13 小时前
从 DataX 的配置加载说起:我用 FastJson2 做了一个轻量级动态配置管理库
java·后端
小锋java123413 小时前
分享一套锋哥原创的SpringBoot4+Vue3宠物领养网站系统
java
考虑考虑17 小时前
Java实现hmacsha1加密算法
java·后端·java ee
掉鱼的猫18 小时前
Spring Boot → Solon 注解迁移实战指南:一张对照表说清楚
java·spring boot
plainGeekDev18 小时前
广播接收器 → Flow + Lifecycle
android·java·kotlin
plainGeekDev18 小时前
EventBus → SharedFlow
android·java·kotlin