[LeetCode] 260. Single Number III Java

题目: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].

题意及分析:给出一个数组,其中里面有两个数只出现一次,其他的均出现两次。找出这两个数。这道题主要和single1类似,但是这里有两个不同的数,所以需要从这两个数的异或值反推得到结果。整数的二进制在java中是补码表示,所以我们可以用n&-n得到n的二进制最右边的一个1。这样对于这个为1的位置,肯定可以分辨出这两个数,因为一定有两个数在这个位置1个为1,另一个为0。所以遍历整个数组,和这个数做&操作,就可以将两个数分开到两组中。因为其他出现两次的数,异或操作还是为0,对结果没有影响,所以对每个遍历到的数做异或操作即可。讲得不是很清楚,看代码就明白了。

代码:

public class Solution {
    public int[] singleNumber(int[] nums) {
        int sum = 0;    //记录所有异或的值,即两个只出现一次数的异或
        for(int i=0;i<nums.length;i++){
            sum ^= nums[i];
        }
        int[] res = new int[2];

        sum &= -sum;        //得出两个数异或结果的最右边的一个1,其他的为零,这样进行&操作就可以将两个不同的数分到不同的两组去
        for(int i=0;i<nums.length;i++){
            if((sum&nums[i])==0) res[0] ^= nums[i];
            else res[1]^=nums[i];
        }
        return res;
    }
}

  

 

posted @ 2017-07-13 09:49  荒野第一快递员  阅读(370)  评论(0编辑  收藏  举报