剑指Offer(40)-数组中只出现一次的数字

题目:

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

题目:

本题主要考察的是异或,两个相同数异或的结果为0。这道题的低级版本是求除一个数字之外的所有数都是两个数字。根据异或的这一特性,我们将数组所有元素进行异或,那么结果就是单独的那个数。
现在我们需要得到两个数字,首先两个不同数字的异或结果肯定不为0。那么我们将所有元素异或后,得到的结果就是两个数异或的结果。我们如何找到两个数的不同点呢?
根据异或的特性,我们找到其异或结果最低位的1,那么这两个元素此二进制位,肯定有一个为1,有一个为0。 接下来我们根据此二进制位是否为1将数组元素分为两个集合,两个要得到的元素在不同的集合中,相同的元素其肯定会分到同一个集合中。因此将这两个集合元素分别异或就会得到要求的的两个数。

代码实现:

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

猜你喜欢

转载自blog.csdn.net/Fly_Fly_Zhang/article/details/92794808
今日推荐