1、对于出现两次的元素,使用“异或”操作后结果肯定为0,那么我们就可以遍历一遍数组,对所有元素使用异或操作,那么得到的结果就是两个出现一次的元素的异或结果。
2、因为这两个元素不相等,所以异或的结果中肯定有一位是1,找到为1的那一位在什么位置。
3、根据那一位的位置将数组分为2组,一组该位都是0,一组都是1,每组分别异或就是最后的结果。
4、再次遍历原数组,将每个元素右移到该位置与1相与,得出最后的结果
public static void main(String[] args) {
int data[] = {1, 2, 2, 3, 3, 4};
int result = 0;
for (int i = 0; i < data.length; i++) {
result = result ^ data[i];
}
//记录异或结果为1的位置
int index = 0;
for (int j = 0; j <= 32; j++) {
//将两个不同数异或的结果result右移N位,如果与1相与结果为1,就证明该N位是1
if ((result >> j & 1) == 1) {
index = j;
break;
}
}
//用一个数组保存结果
int resultA[] = new int[2];
for (int i = 0; i < data.length; i++) {
//将原数组右移上面的N位与1相与分成两组,得出结果
if ((data[i] >> index & 1) == 0) {
resultA[0] = resultA[0] ^ data[i];
} else {
resultA[1] = resultA[1] ^ data[i];
}
}
System.out.println(Arrays.toString(resultA));
}