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

Posted 数据结构和算法

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 260. 只出现一次的数字 III相关的知识,希望对你有一定的参考价值。

在这里插入图片描述

想看更多算法题,可以扫描上方二维码关注我微信公众号“数据结构和算法”,截止到目前我已经在公众号中更新了500多道算法题,其中部分已经整理成了pdf文档,截止到目前总共有1000多页(并且还会不断的增加),可以在公众号中回复关键字“pdf”即可下载。

在这里插入图片描述


位运算解决

参考《494,位运算解只出现一次的数字》
在这里插入图片描述
在这里插入图片描述
我们看到异或结果最右边的1,也就是红色部分,根据这个位置是0还是1把原数组分为两组,那么13和17肯定不在同一组。那么每组就变成了只有一个数字出现一次,其他数字都出现两次。然后我们就可以使用《494,位运算解只出现一次的数字》的方式来解了。代码如下

public int[] singleNumber(int[] nums) {
    int bitmask = 0;
    //把数组中的所有元素全部都异或一遍
    for (int num : nums) {
        bitmask ^= num;
    }
    //因为异或运算的结果不一定都是2的n次幂,
    //在二进制中可能会有多个1,为了方便计算
    //我们只需保留其中的任何一个1,其他的都
    //让他变为0,这里保留的是最右边的1
    bitmask &= -bitmask;
    int[] rets = {0, 0};
    for (int num : nums) {
        //然后再把数组分为两部分,每部分在
        //分别异或
        if ((num & bitmask) == 0) {
            rets[0] ^= num;
        } else {
            rets[1] ^= num;
        }
    }
    return rets;
}

上面的位运算bitmask &= -bitmask;表示的是把bitmask二进制中最右边的1保留,其他位置全部变为0,随便找个数据打印一下

图片

再来看一下运算结果

图片

以上是关于LeetCode 260. 只出现一次的数字 III的主要内容,如果未能解决你的问题,请参考以下文章

leetcode260. 只出现一次的数字Ⅲ

LeetCode Java刷题笔记—260. 只出现一次的数字 III

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

Leetcode刷题Python260. 只出现一次的数字 III

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

LeetCode只出现一次的数字i/ii/iii