算法:【位运算】

位运算

图片说明

  1. 只出现一次的数字 III

    给定一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。 找出只出现一次的那两个元素。你可以按 任意顺序 返回答案。
    进阶:你的算法应该具有线性时间复杂度。你能否仅使用常数空间复杂度来实现?

    输入:nums = [1,2,1,3,2,5]
    输出:[3,5]
    解释:[5, 3] 也是有效的答案。

思路:
先对所有数字进行一次异或,得到两个出现一次的数字的异或值。

在异或结果中找到任意为 11 的位。

根据这一位对所有的数字进行分组。

在每个组内进行异或操作,得到两个数字。

图片说明

class Solution {
    public int[] singleNumber(int[] nums) {
        int res = 0;
        for(int n : nums)
            res ^= n;
        int div = 1;
        /* 如果我们可以把所有数字分成两组,使得:
            1.两个只出现一次的数字在不同的组中;
            2.相同的数字会被分到相同的组中。
        */
        while((div & res) == 0)
            div <<= 1;
        int a = 0, b = 0;
        for(int n : nums){
            if((div & n) == 0)  
                a ^= n;
            else
                b ^= n;
        }
        return new int[]{a, b};
    }
}
全部评论

相关推荐

被普调的六边形战士很高大:项目经历貌似和专业或者求职方向没大关系?
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务