数组中只出现一次的数字

来源:互联网 发布:看不见的客人影评知乎 编辑:程序博客网 时间:2024/06/11 21:19

1.题目描述
一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
传送门
2.code(java1.7版本)
大多数人想到的常规的版本

//num1,num2分别为长度为1的数组。传出参数//将num1[0],num2[0]设置为返回结果import java.util.*;public class Solution {    public void FindNumsAppearOnce(int [] array,int num1[] , int num2[]) {        if(array==null)return;        int len=array.length;        HashMap<Integer,Integer> map=new HashMap<Integer,Integer>();        for(int i=0;i<len;i++){            if(map.containsKey(array[i])){                map.remove(array[i]);            }            else{                map.put(array[i],1);            }        }        boolean flag1=false;        boolean flag2=false;        Iterator iter = map.entrySet().iterator();        while(iter.hasNext()){           Map.Entry entry = (Map.Entry)iter.next();           Object key = entry.getKey();           Object val = entry.getValue();            if(!flag1){                num1[0]=(int)key;                flag1=true;                continue;            }           if(!flag2){               num2[0]=(int)key;               flag2=true;               continue;           }        }    }}

运用异或办法实现的神奇版本

//num1,num2分别为长度为1的数组。传出参数//将num1[0],num2[0]设置为返回结果import java.util.*;public class Solution {    public void FindNumsAppearOnce(int [] array,int num1[] , int num2[]) {        if(array==null)return;        int len=array.length;        if(len==1)return;        int ans=0;        int flag=1;        for(int i=0;i<len;i++){            ans^=array[i];        }        while((ans&flag)==0)flag<<=1;        num1[0]=ans;        num2[0]=ans;        for(int i=0;i<len;i++){            if((flag&array[i])==0)num1[0]^=array[i];            else num2[0]^=array[i];        }    }}

3.解题思路
对于非常常规的版本,就不多说了,主要就是遍历统计每个数出现的次数,再将只出现一次的数进行赋值返回即可。
对于运用异或的版本,主要的思想就是二进制数之间进行异或,相同的异或为0,不相同的异或为1。这样可以过滤掉出现两次的数,剩下只出现一次的数,这样即可完成查找。

原创粉丝点击