描述
一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
思路:
①整体异或,最终结果一定是不同数据的异或,结果x一定不为零!!!
②x != 0—>(10100001),一定有比特位为1,意味这什么?
不同的2个数据,该位置的比特位是不同的。
③假设是第n位,根据遍历检测每一个数组的第一n位,根据是否为1,将其分为A、B两组
④凡是相同的数据一定在同一组
⑤结论A或B(转换成一个整型数组里除了一个数字之外,其他的数字都出现了两次。请写程序找出这一个只出现一次的数字。)
注意!!!
任何数和0异或就是它本身!
代码实现:
//num1,num2分别为长度为1的数组。传出参数
//将num1[0],num2[0]设置为返回结果
public class Solution {
public void FindNumsAppearOnce(int [] array,int num1[] , int num2[]) {
if(array == null || num1 == null || num2 == null){
return ;
}
//1.整体按位异或
int result = array[0];
for(int i = 1; i < array.length;i++){
result^=array[i];
}
//2.最终结果一定不为0,找到该数据的第一个bit位,按从低到高
int size = Integer.SIZE;
int flag = 1;//000000000000000000001 >0000000000100000 类似这种
int i = 0;
while(size > 0){
if(((flag << i ) & result ) != 0){
flag <<= i;
break;
}
i++;
size--;
}
//3.分组
num1[0] = 0;
num2[0] = 0;
for(i = 0;i < array.length; i++){
if(((array[i]) & flag )== 0){
//A组
num1[0]^=array[i];
}else{
//B组
num2[0]^=array[i];
}
}
}
}