[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; } }