• 思路:两个雷同的数字异或等于0

    • 假如数组中只有一个数字是只呈现了一次的,那么从头到尾将数组中所有数字都进行异或,失去的最终后果就是这个数字。
    • 题目中的数组是有两个数字只呈现一次的,假如为a和b,咱们仍然从头到尾对所有数字进行异或,那么最终后果就是a和b的异或后果
    • a和b的异或后果中有至多一位为1,把后果中第一位1(从右往左数的)记录地位,设为Index,那就阐明a和b在Index对应的位上别离为0和1
    • 依据这一位上的区别,将数组分为两组,别离相与,失去a和b。
  • 代码如下:

    public int[] FindNumsAppearOnce(int[] array){        if(array==null)            return null;        int[] res=new int[]{0,0};//数组中的两个地位别离记录a和b        int number=array[0];        for(int i=1;i<array.length;i++){            number^=array[i];        }        //找到后果中第一位1的地位        int index=0;        while((number & 1)==0){//与1相与为0阐明末位是0            number=number>>1;//右移位            index++;        }        for(int i=0;i<array.length;i++){            //如果&1=0,阐明第index位上为0            boolean isZero =((array[i]>>index) & 1)==0;            //将该位为0的全副相与,失去的是一个只呈现一次的数字;该位为1的全副相与,失去另一个            if(isZero)                res[0]^=array[i];            else                res[1]^=array[i];        }        return res;}
  • 小结:

    • 当雷同的数字呈现偶数次时,应用异或^能够对这样的数字进行打消**。
    • 将某个数x右移m位,要写成 x=x>>m;而不能只写成 x>>m;