public class TwoNumShowOnceInArr56 {
public static void main(String[] args) {
int[] arr = {2, 4, 3, 6, 3, 2, 5, 5};
findit(arr);
}
private static void findit(int[] arr) {
//arr数组长度必须是偶数
if ((arr.length & 1) == 1) {
return;
}
int temp = 0;
for (int i = 0; i < arr.length; i++) {
temp ^= arr[i];
}
//按照index将所有数分为两半
int index = 1;
while ((temp & 1) != 1) {
temp = temp >> 1;
index++;
}
List<Integer> list1 = new ArrayList<>();
List<Integer> list2 = new ArrayList<>();
for (int i = 0; i < arr.length; i++) {
if (isOne(arr[i], index)) {
//第index位是1,放入list1
list1.add(arr[i]);
} else {
list2.add(arr[i]);
}
}
int first = 0;
for (int a: list1) {
first ^= a;
}
int last = 0;
for (int a: list2) {
last ^= a;
}
System.out.println("first: "+ first+" "+"second: "+last);
}
private static boolean isOne(int num, int index) {
int count = 1;
while ((num & 1) != 1) {
num = num >> 1;
count++;
}
if (count == index)
return true;
return false;
}
}
解释:先将数组分割为两部分,每部分都包含一个只出现一次的数,然后,两个数组间的元素异或,即可得出两个只出现一次的元素;关键是怎么分割成两个数组?