• 剑指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);
     }
    }
  • 相关阅读:
    301重定向 修改默认网站访问文件
    修改本地host 文件 实现多“域名”访问 host'实现FQ
    thinkphp3.2.3 整合 富文本编辑器
    thinkphp3.2.3 跨数据库查询
    git 码云上关联仓库 克隆代码
    PHP GD库中输出图像乱码问题
    mysql 新建用户
    
    算法思想:
    算法思想:
  • 原文地址:https://www.cnblogs.com/hupp/p/4770417.html
Copyright © 2020-2023  润新知