package lianxi_1;
import java.util.ArrayList;
import java.util.List;
//如果一个数组中只有两个数字出现1次,其他都是出现2次,请找出这2个数字
//思路:将数字元素全部异或一遍,因为相同的元素异或以后为0,所以结果为出现1次的两个数字异或结果
//将异或结果按照二进制中不为0的最低位进行划分,将数组分成2个子数组,那么出现2次的都是同一个子数组,出现1次的在不同数组
//分别对每个子数组全部异或,即可
public class Exercise_13 {
static void fun(int[] a) {
int x = 0;
for (int i = 0; i < a.length; i++)
x ^= a[i];
int j = 1;
// 找出异或结果二进制表示中不为0的最低位
while (true) {
if ((x & j) == j) {
divArray(a, j);
break;
}
j *= 2;
}
}
private static void divArray(int[] a, int j) {
List<Integer> a1 = new ArrayList<>();
List<Integer> a2 = new ArrayList<>();
for (int i = 0; i < a.length; i++) {
if ((a[i] & j) == j)
a1.add(a[i]);
else
a2.add(a[i]);
}
int x = 0;
for (int i : a1) {
x ^= i;
}
System.out.println(x);
x = 0;
for (int i : a2)
x ^= i;
System.out.println(x);
}
public static void main(String[] args) {
int[] a = new int[] { 1, 1, 5, 6, 7, 4, 8, 4, 3, 8, 7, 3 };
fun(a);
}
}