LeetCode 260. 只出现一次的数字 III

更多题解尽在 https://sugar.matrixlab.dev/algorithm 每日更新。

组队打卡,更多解法等你一起来参与哦!

LeetCode 260. 只出现一次的数字 III ,难度中等

位运算

解题思路:

  • 根据相同的数字异或结果为 0 的特性,我们可以计算出两个只出现一次的数字异或的结果,但是还无法找到具体是哪两个数字。
  • 找出异或结果中任意一位为 1 的位置,利用这一位将数组分为两组;一组当前位为 0,另一组当前位为 1,这样两个只出现一次的数字会被分到不同的组中,其他所有成对的数字仍会被异或抵消为 0。
Java 复制代码
class Solution {
    public int[] singleNumber(int[] nums) {
        int[] result = new int[2];
        
        // 异或所有数字,得到两个不同数字的异或结果
        int xor = 0;
        for (int num : nums) {
            xor ^= num;
        }
        
        // 利用 xor & (-xor) 找出最低位的 1
        int diff = xor & (-xor);

        // 分组异或,num & diff 与运算区分出第 diff 位是否相同,进而将整个 num 分为两组
        for (int num : nums) {
            if ((num & diff) == 0) {
                result[0] ^= num;
            } else {
                result[1] ^= num;
            }
        }

        return result;
    }
}
相关推荐
老鼠只爱大米3 分钟前
LeetCode经典算法面试题 #215:数组中的第K个最大元素(快速选择、堆排序、计数排序等多种实现方案详解)
算法·leetcode·堆排序·快速选择·topk·数组中的第k个最大元素
2301_8166512210 分钟前
C++中的享元模式变体
开发语言·c++·算法
逆境不可逃12 分钟前
LeetCode 热题 100 之 35. 搜索插入位置 74. 搜索二维矩阵 34. 在排序数组中查找元素的第一个和最后一个位置
数据结构·算法·leetcode
m0_5832031313 分钟前
C++中的访问者模式变体
开发语言·c++·算法
浅念-20 分钟前
C ++ 智能指针
c语言·开发语言·数据结构·c++·经验分享·笔记·算法
不染尘.21 分钟前
最小生成树算法
开发语言·数据结构·c++·算法·图论
Klong.k34 分钟前
判断是不是素数题目
数据结构·算法
QQsuccess35 分钟前
AI全体系保姆级详讲——第一部分:了解AI基本定义
人工智能·算法
_日拱一卒38 分钟前
LeetCode:移动零
算法·leetcode·职场和发展
A923A1 小时前
【洛谷刷题 | 第四天】
算法·前缀和·贪心·洛谷·差分