数组中只出现一次的数字

题目描述

一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
 
 
 
这个题是另一个题的进化版本         一个整型数组里除了一个数字之外,其他的数字都出现了两次。请写程序找出这这个只出现一次的数字。
这个题只需要从0开始 从头到尾异或一遍,最后的结果就是那个数字(原理,0异或任何数字都是原来的数字,两个相同的数字异或为0)。
 
这个题也是用 0从头到尾异或一遍,最后的结果就是这两个出现过一次的数字的异或的结果,找到这个结果中某一个为一的一位(2进制中的为一的位置),那么这两个数字中这一位
肯定不同,因为是异或出来的结果。   比如是倒数第三位 ,那么让所有的数字 都与4异或,等于0的一组,不等于0的一组,在两组中分别求那一个单独出现的数字
 
可以在判断属于哪一组的时候直接异或,最后的两个结果就是那两个数字
过程看起来很复杂,代码其实很简单
//num1,num2分别为长度为1的数组。传出参数
//将num1[0],num2[0]设置为返回结果
public class Solution {
    public void FindNumsAppearOnce(int [] array,int num1[] , int num2[]) {
        int beforeans=0;
        for(int i=0;i<array.length;i++){
            beforeans=beforeans^array[i];
        }
        int n=1;
        if((beforeans&n)==0) n<<=1;  
        int i=0,j=0;
        for(int k=0;k<array.length;k++){
            if((array[k]&n)==0) i^=array[k];
            else j^=array[k];
        }
        num1[0]=i;
        num2[0]=j;
    }
}

 

posted @ 2016-10-01 01:10  萝卜er  阅读(117)  评论(0编辑  收藏  举报