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

Posted le-le

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指offer:数组中只出现一次的数字相关的知识,希望对你有一定的参考价值。

题意描述

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

解题思路

一、思路一

使用Set集合,遍历数组,当数字第一次出现时,加入Set,当数字第二次出现时,从Set中删除。最后Set中剩余的元素就是结果,赋值给num1、num2

二、思路二

利用异或运算:两个相同数字异或=0,一个数和0异或还是它本身 。

假设数组中两个不同的值是A、B,将数组中的元素逐个异或,最终结果就是AB异或的结果。

两值的区别是,在二进制表示的情况下,至少有一位不同。我们可以取第一个1所在的位数,将数组分成两部分。

相同的数值一定在同一组,不同的值一定在不同组。将两组值逐个进行异或处理,最终得到两个只出现一次的数值。

    public void FindNumsAppearOnce(int [] array,int num1[] , int num2[]) {
            if(array == null) return ;
            num1[0] = 0;
            num2[0] = 0;
            int bit = 0;
            for(int i=0;i<array.length;i++){
                bit ^= array[i];
            }
            int index = first(bit);		//得到第一个1所在的位置
            for(int i=0;i<array.length;i++){
                if(isBit(array[i],index)){	//根据 当前数字index位是否为1 进行区分
                    num1[0] ^= array[i];
                }else{
                    num2[0] ^= array[i];
                }
            }
    }

	public int first(int bit){
            int index = 0;
            while(((bit&1)==0) && index<32){	//从右向左开始查找,当前位不是1,并且没有溢出
                bit >>= 1;		//右移一位
                index ++;		
            }
            return index;
    }
	public boolean isBit(int target,int index){
            return ((target >> index) & 1) == 1;	//第index位是1 返回true
    }

以上是关于剑指offer:数组中只出现一次的数字的主要内容,如果未能解决你的问题,请参考以下文章

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

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

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

剑指offer 40.知识迁移能力 数组中只出现一次的数字

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

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