题目描述
一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
题解
位运算基础:如果a、b两个值不相同,则异或结果为1。如果a、b两个值相同,异或结果为0。
因此数组中所有元素进行异或运算得到的结果,也就是两个只出现一次的数字运算的结果。假设结果为1110,为1的位说明,这两个出现一次的数字在该位置的值不同,一个为01,一个为1从右向左,第二位结果是1,根据此进行分组。数组元素中第二位是1的为一组,第二位是0的为另一组。
分别进行异或后得到的两个值即为结果。
代码
public class Solution {
public void FindNumsAppearOnce(int [] array,int num1[] , int num2[]) {
int len = array.length;
int res = 0;
for(int i=0;i<len;i++){
res ^= array[i];
}
int index = 0;
while((res & 1) !=1){
res >>=1;
index++;
}
for(int i=0;i<len;i++){
if(isBit(array[i],index)){
num1[0] ^= array[i];
}else{
num2[0] ^= array[i];
}
}
}
public boolean isBit(int num,int index){
num = num >> index;
return (num & 1) == 1;
}
}