剑指offer(40)数组中只出现一次的数字
//num1,num2分别为长度为1的数组。传出参数
//将num1[0],num2[0]设置为返回结果
//任何一个数字异或本身都为0
//全部异或,剩余的为两个出现一次的数字的异或,找这个数字中的1出现的位置,即为两个数字不同的地方
//按照这个位置将array分为两个数组,其中num1[]和num2[]分别在两个数组中
//两边再次全部异或,剩下的即为所求
public class Solution {
public void FindNumsAppearOnce(int [] array,int num1[] , int num2[]) {
if(array == null && array.length < 2){
return;
}
int allOR = 0;
for(int i = 0;i < array.length;i++){
allOR ^= array[i];
}
int place1 = findPlace1(allOR);
for(int j = 0;j < array.length;j++){
if(binaryArr(array[j], place1)){
num1[0] ^= array[j];
}else{
num2[0] ^= array[j];
}
}
}
public int findPlace1(int allOR){//求两个只出现一次数字异或之后的1的位置
int place1 = 0;
while((allOR & 1) != 1 &&place1 < 4*8){
allOR = allOR >> 1;
++place1;
}
return place1;
}
public boolean binaryArr(int num, int place1){
num = num >> place1;
return (num & 1) == 1;
}
}