Leetcode260 Single Number III

leetcode代码已经放入github:[https://github.com/gaohongbin/leetcode](https://github.com/gaohongbin/leetcode)
题目:
Given an array of numbers nums, in which exactly two elements appear only once and all the other elements appear exactly twice. Find the two elements that appear only once.

For example:

Given nums = [1, 2, 1, 3, 2, 5], return [3, 5].

Note:
The order of the result is not important. So in the above example, [5, 3] is also correct.
Your algorithm should run in linear runtime complexity. Could you implement it using only constant space complexity?

翻译:
给一个数组,在这个数组中,只有两个数只出现了一次,其他所有的数都在数组中出现了两次。找出这两个只出现了一次的数。

小提示:
1.结果中两个数的顺序没有要求。
2.你的算法时间复杂度可以为O(n)吗?你的空间复杂度可以为O(1)吗?

思路:
假设数组中只出现一次的数分别为A,B;
我们都知道 X^X=0; 所以如果将数组中的数字全部进行异或处理,则结果与 A^B相等. 而且因为A!=B,则A^B!=0.
则A,B用二进制表示时1的位置也不尽相同。
N&(-N)的结果为N的最右边的1和后面所有0所组成的整数。
例: N=6 即(0110)
则 6 &(-6) =2;

因为这个1是从A^B中找出来的,则A和B的二进制在该位置上肯定一个为0,一个为1.

依据这样就可以把整个数组分为两大类,(1)该二进制位为1的数
(2)该二进制位为0的数

现在我们只需要在这被划分的两个数组中,分别找出只出现一次的那个数即可。

代码:

public int[] singleNumber(int[] nums) {
            int length=nums.length;
            int AxorB=0;

            for(int i=0;i<length;i++){
                AxorB=AxorB^nums[i];
            }

            int mask=AxorB & (-AxorB);
            int A=0,B=0;
            for(int i=0;i<length;i++){
                if((mask & nums[i])==0)
                    A^=nums[i];
                else
                    B^=nums[i];
            }

            int[] singleNumber=new int[]{A,B};
            return singleNumber;
        }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值