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
本题和single number1,2不同之处在于,本题有两个single number,其他都是成对存在的,我们首先可以考虑,a&(-a)为什么,他的结果是从右面数第一个1,而我们知道,singnumber1^singnumber2==a,说明1和2的位不同数是a,则右面数第一个不同位就是a&(-a),这也是可以把它们区别开的办法,代码如下:
1 public class Solution { 2 public int[] singleNumber(int[] nums) { 3 int[] res = new int[2]; 4 int xor = 0; 5 for(int i=0;i<nums.length;i++){ 6 xor= xor^nums[i]; 7 } 8 xor = xor&(-xor); 9 for(int i=0;i<nums.length;i++){ 10 if((xor&nums[i])==xor){ 11 res[0]=res[0]^nums[i]; 12 }else{ 13 res[1] = res[1]^nums[i]; 14 } 15 } 16 return res; 17 } 18 }