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.
Example:
Input:[1,2,1,3,2,5]
Output:[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?
和136不同的是,这里有2个只出现一次的数字。还是先把所有数字xor一遍,出来的结果是这两个数的xor,即 tmp = a ^ b,现在需要分离这两个数。可以任选其中的一个为1的位,比如tmp & -tmp,是最右的1,然后把tmp和所有数字相与(&),通过这一步可以把答案的两个数分到两个组,然后再对两个小组分别异或,就可以得到这两个数
time: O(N), space: O(1)
class Solution { public int[] singleNumber(int[] nums) { int[] res = new int[2]; int tmp = 0; for(int k : nums) { tmp ^= k; } tmp &= -tmp; for(int k : nums) { if((k & tmp) == 0) res[0] ^= k; else res[1] ^= k; } return res; } }
reference: http://www.cnblogs.com/grandyang/p/4741122.html