剑指offer——数组中只出现一次的数字

时间:2022-12-30 14:30:30

数组中只出现一次的数字

一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。

 

在位运算中的异或 ^ 可以将两个相等的数组消去,而在这一题目中,有两个不相等的数字,所以他们之间至少有一位不同

含有1(如5和2  1001  0010)异或之后的结果是1011,在数组中,按照1的位置这一结果的不同,

将这些数分为两份,一份是第一位为1的,另外一份是为0的,

其中那两个不一样的数字会因为这个而分开,进而可以用异或来求出

 

//num1,num2分别为长度为1的数组。传出参数
//将num1[0],num2[0]设置为返回结果
public class Solution {
    public void FindNumsAppearOnce(int [] array,int num1[] , int num2[]) {
        int len = array.length;
        int num = array[0];
        for(int i = 1; i < len; i++){
            num ^= array[i];
        }
        int flag = 1;
        while(num != 0){
            if((num & flag) == 0) flag = flag << 1;
            else break;
        }
        num1[0] = num2[0] = num;
        for(int i = 0; i < len; i++){
            if((array[i] & flag) == 0){
                num1[0] ^= array[i];
            } else{
                num2[0] ^= array[i];
            }
        }
    }
}