這個題是有兩個數字出現一次 剩下的全都出現兩次
方法是先找到這兩個數的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;
}
}