面试题五十六:数组中数字出现的次数

 

题目一:数组中只出现一次的两个数字 :除了两个数字只出现过一次,其他都出现两次;要求时间复杂度n 空间复杂度1
方法:由于其他出现两次,所以异或的结果是两个只出现过一次数字的异或结果,结果肯定不为0;那么结果用二进制表示中的第一个‘1’的位置,对数组进行分类,该位置为1的和0的,分为两个数组,此时 这两个数组分别 求只出现过一次的那个数就可以的出了;

static void FindNumsAppearOnce(int []date) {
        if(date==null||date.length<2)
            return ;
        int re=0;//全部异或的结果
        for(int i=0;i<date.length;i++)
            re^=date[i];
        //寻找结果中第一位为1的位置
        int indexof=0;
        while(re!=0) {
            if((re&1)==1)
                break;
            indexof++;
            re>>=1;
        }
        re=1<<indexof; 
        //根据这个位置进行分组异或
        int num1=0,num2=0;
        for(int i=0;i<date.length;i++) {
            if((date[i]&re)==0)
                num1^=date[i];
            else
                num2^=date[i];            
        }
        System.out.println(num1);
        System.out.println(num2);
                
    }

题目二:数组中唯一出现过一次的数字,其他数字出现过三次
方法:创建32的数组,把每一一个数字用二进制表示,加到相对应的数组中;如果数组的值能被三整除,那么就表示要找那个数字对应的那一位是0,否则是1

 static void FindOnlyOne(int[] array) {
             if(array==null||array.length<1)
                  return ;
             int []B=new int [32];
             for(int i=0;i<array.length;i++) {
                  int bitMask=1;
                  for(int j=31;j>=0;j--) {
                      int bit=array[i]&bitMask;
                      if(bit!=0)
                           B[j]++;
                      bitMask<<=1;
                  }        
             }
             int result=0;
             for(int i=0;i<32;i++) {
                  result<<=1;
                  result+=B[i]%3;
             }
             System.out.println(result);
         }

 

posted @ 2020-03-29 16:55  浪波激泥  阅读(285)  评论(0编辑  收藏  举报