思路来自剑指offer,采用异或的思路:
(1)将全部元素异或得到关键元素key;
(2)根据key的某一非零位将数组划分为两个子数组,此时两个单独出现的数字分别在两个子数组中;
(3)两个子数组的全部元素分别异或,获得两个单独出现的数字。
/**
* 关键变量命名为key,通过key将array分为两个数组
* flag记录key中某一个不为零的位置
* @param array
* @param num1
* @param num2
*/
public static void FindNumsAppearOnce(int [] array,int num1[] , int num2[]) {
if(array==null||array.length%2!=0) return;
int key=0;
int flag=1;
for(int elem: array){
key^=elem;
}
while((key&flag)==0){
flag=flag<<1;
}
for(int elem:array){
if ((elem&flag)!=0) num1[0]^=elem;
else num2[0]^=elem;
}
}