zoukankan      html  css  js  c++  java
  • 剑指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);
     }
    }
  • 相关阅读:
    EXE中释放文件
    关闭GS选项,解决注入后崩溃
    HDU2516 取石子游戏
    HDU2188 选拔志愿者
    HDU2149 Public Sale
    HDU2147 kiki's game
    HDU1846 Brave Game
    LightOJ1214 Large Division
    POJ2480 Longge's problem
    HDU 5880 Family View
  • 原文地址:https://www.cnblogs.com/hupp/p/4770417.html
Copyright © 2011-2022 走看看