剑指offer:找出整型数组除两个数只出现一次的数

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

思路:

1)如果把数组中的所有数字都依次异或一遍,则可以消掉成对出现的数字,那么还有两个数字是单一的,肯定也不同,那么最终异或的结果肯定不是0。表示在二进制中肯定有一位是1,那么两个不同的数字,一定有一个在该位为1,另一个在该位为0。如果将整个数组按照该位是否为1分为两部分,那么这两部分各自包含一个单一数字。这里实现这个就需要设置一个flag标志位,通过对其左移动来实现。

flag<<= 1;或者是flag=flag*2;

2)分为两部分的数组,分别异或,最终结果就是这两个数。

3)注意:这个flag就是我们一个额外的条件,按照条件查找,边查找,边异或就行了。

代码实现:

public class Solution {
    public void FindNumsAppearOnce(int [] array,int num1[] , int num2[]) {
        int flag=1;
        int temp=array[0];
        for(int i=1;i<array.length;i++){
            temp=array[i]^temp;
        }
        while((flag&temp)==0) flag<<= 1;
         for(int i = 0; i < array.length; ++ i ){
            if((flag & array[i]) == 0) num2[0]^= array[i];
            else num1[0]^= array[i];
        }
   
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_30363263/article/details/80747710
今日推荐