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?
思路: // xor 得到的是两个只出现一次数的xor;
// (-xor) 负数的表示是反码+1,这样xor & (-xor)就得到了 最后一个bit是1,
// 这个bit可以区分这两个数,一个数 & mask = 0 另外一个数 & mask = 1; 其余的数都是偶数
class Solution {
public int[] singleNumber(int[] nums) {
int xor = 0;
for(int i = 0; i < nums.length; i++) {
xor = xor ^ nums[i];
}
// xor 得到的是两个只出现一次数的xor;
// (-xor) 负数的表示是反码+1,这样xor & (-xor)就得到了 最后一个bit是1,
// 这个bit可以区分这两个数,一个数 & mask = 0 另外一个数 & mask = 1; 其余的数都是偶数
int mask = xor & (-xor);
int[] res = new int[2];
for(int i = 0; i < nums.length; i++) {
// 把原数组分为两个group,一个group & mask = 0, 另外一个grou & mask = 1;
if((mask & nums[i]) == 0) {
res[0] ^= nums[i];
} else {
res[1] ^= nums[i];
}
}
return res;
}
}