这个题是有两个数字出现一次 剩下的全都出现两次
方法是先找到这两个数的xor 即全都xor到一起
然后找到这个xor的最后一位置位的位置(为1 的那位) 说明这一位上 这两个数字不同
得到这个last set bit的方法是 num &= - num 一个数的complement 是-num。 一个数和它的补码and 就会得到 last set bit
然后 设置两个累加的xor 假如一个数和这个last set bit 一致 就xor到一个上面 假如不一致 就xor到另一个上面 这样这两个出现一次的数字就能被分开了
public class Solution {
public int[] singleNumber(int[] nums) {
int xor = 0;
for ( int i = 0; i < nums.length; i ++ ){
xor ^= nums[i];
}
xor &= -xor;
int group1 = 0;
int group2 = 0;
for ( int i = 0; i < nums.length; i ++ ){
if ( (nums[ i ] & xor) == 0 )
group1 ^= nums[ i ];
else
group2 ^= nums[ i ];
}
int [] res = new int [ 2 ];
res [ 0 ] = group1;
res [ 1 ] = group2;
return res;
}
}