Given an array of integers, every element appears twice, except for two. Find the two singles.
思路:先全部异或,在得到的结果中找任意一个二进制位为1的位置。根据这个位置的数值的不同,将原数组A分为A1和A2两个数组,即:A1存该位全部为1的元素,A2存该位全部为0的元素。分别将A1和A2异或,得到的结果就是需要寻找的两个single numbers。
Solution:
public int[] singleNumber(int[] A) {
if (A == null || A.length == 0) {
return null;
}
int res[] = new int[2];
int diff = 0;
for (int i = 0; i < A.length; i++) {
diff ^= A[i];
}
int diffPos = 0;
for (int i = 0; i < 32; i++) {
if ((diff >> i & 1) == 1) diffPos = i;
}
ArrayList<Integer> A1 = new ArrayList<Integer>();
ArrayList<Integer> A2 = new ArrayList<Integer>();
for (int i = 0; i < A.length; i++) {
if ((A[i] >> diffPos & 1) == 1) {
A1.add(A[i]);
} else {
A2.add(A[i]);
}
}
for (int i = 0; i < A1.size(); i++) {
res[0] ^= A1.get(i);
}
for (int i = 0; i < A2.size(); i++) {
res[1] ^= A2.get(i);
}
return res;
}