剑指offer-第六章面试中的各项能力(数组中只出现一次的数字)

题目:输入一个数组,该数组中有两个只出现一次的数字,其他的数字都出现两次,输出出只出现一次的数字。

思路:首先,我们可以将这个数组分成两份,一份里面放一个只出现一次的数字。那么我们该怎么分呢?将整个数组中的数字都异或,那么那些等的数字异或后都化为0,因此最后出现的不为0的数字就是两个只出现一次的数字他们两个异或的结果。我们找到该结果中的最右边的一个1,然后根据这个1将数组划分为两份。

Java代码:

//数组中只出现一次的数。
//题目:数组中其他的数都是出现两次,有两个数只出现一次。
public class OnlyTimeApprance {
  public void findOneTimeAppranceOfArr(int[] a){
      int resultExclusiveOr1=0;
      int resultExclusiveOr2=0;
      if(a==null||a.length<2)
          return;
      int resultExclusiveOr=0;//用来表示整个数组异或后的结果
      for(int i=0;i<a.length;i++){
          resultExclusiveOr^=a[i];
      }
      int indexOf1=firstRightOne(resultExclusiveOr);
      for(int i=0;i<a.length;i++){
          if(isBit1(a[i],indexOf1))
             resultExclusiveOr1^=a[i];
          else
             resultExclusiveOr2^=a[i];
      }
    
    
      System.out.println(resultExclusiveOr1+" "+resultExclusiveOr2);
         
          
  }

  public boolean isBit1(int i, int indexOf1) {
    i=i>>indexOf1;
    if((i&1)==0) 
        return false;
    return true ;
  }

 public int firstRightOne(int resultExclusiveOr) {
     int indexBit1=0;
     while((resultExclusiveOr&1)==0){
         resultExclusiveOr=resultExclusiveOr>>1;
         indexBit1++;
     }
     return indexBit1;
  }
 public static void main(String[] args){
     int[] a={2,3,3,4,4,5,5,6};
     OnlyTimeApprance ota=new OnlyTimeApprance();
     ota.findOneTimeAppranceOfArr(a);
 }
}

 

posted @ 2015-08-30 10:33  lisahappy  阅读(276)  评论(0编辑  收藏  举报