题目
一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
思想
异或
代码
import java.util.*;
public class Solution {
public void swap(int[] a, int l, int r){
int o = a[l];
a[l]=a[r];
a[r]=o;
}
public int[] FindNumsAppearOnce (int[] array) {
// write code here
int[]a=new int[2];
int x=array[0];
//将数组中所有数字做异或处理
//由于相同数字异或结果为0,0与数字x异或的结果为x
//所以最终的结果为单独出现的数字的异或结果
for(int i=1;i<array.length;i++){
x^=array[i];
}
int m=1;
//两个单独出现的数字若在m位相异,则在x中第m位为1
//找到这样的m位
while ((m&x)==0){
m=m<<1;
}
//根据第m位的值将原数组分为两组,单独出现的两个数字分在不同的组
for(int i:array){
if((m&i)==0){
a[0]^=i;
}else {
a[1]^=i;
}
}
if(a[0]>a[1]){
swap(a,0,1);
}
return a;
}
}