数组中只出现一次的数字

来源:互联网 发布:matlab矩阵做聚类分析 编辑:程序博客网 时间:2024/04/25 16:50

思路:

(1)如果只有一个数字只出现一次,那么对所有数字做异或运算,由于一个数和自身做异或运算结果为0,而任何数字与0做异或运算结果为它本身,因此,最后的结果便是那个只出现一次的数。

(2)同样对所有数字做异或运算,结果应该是两个只出现一次的数字做异或运算的结果。由于这两个数字不同,因此结果非0。不妨假设结果的二进制表示中第index位非0,那么这两个唯一出现的数字在第index位上不同。从而可以根据这一位把数组中的所有元素分成两部分。这两个唯一出现的数字必然会被分开,并且,相同的两个数会被分在同一组。

(3)这样,便可以用(1)的方法取分别求出这两个数字,边分组,边异或运算的结果。注意,两个数均初始化为0,因为如果该组中唯一出现的数字不是0,显然能够得到结果,即使为0,由于0与0做异或运算也得到0,所以可是这么初始化。

//num1,num2分别为长度为1的数组。传出参数
//将num1[0],num2[0]设置为返回结果
public class Solution {
    public void FindNumsAppearOnce(int [] array,int num1[] , int num2[]) {
        int temp = array[0];
        for(int i = 1; i < array.length; i++)
         temp ^= array[i];
        
        int first1Index = 0;
        while((temp & 0x1) != 1) {
         temp >>= 1;
         first1Index++;
        }
        
        int judge = (int) Math.pow(2, first1Index);
        num1[0] = 0;
        num2[0] = 0; // 因为0与任何数做异或运算都等于这个数本身,所以可以这样初始化。
        for(int i = 0; i < array.length; i++) {
         if((array[i] & judge) == 0)
         num1[0] ^= array[i];  
         else
         num2[0] ^= array[i];
        }
        
    }
}

0 0