牛客网题目-数组中只出现1次的数字

题目描述如下:

一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字

题解的主要思想

  1. 异或运算,两个数字相同,异或运算所得结果为0,如果数组中只有一个数出现一次,其他数字都是出现两次,
    根据异或运算原理,就可以将数组所有数字异或,就可以找出,这个只出现一次的数字

  2. 如果数组只有两个数字出现一次,可以将数组分成两组,每组只含有一个只出现一次的数字。如何将数组分成这样的子数组?
    数组中所有数字异或所得结果必定不会0,可以从这个数字提取某一位等于1,将数组所有数组就可以分成,与改位为1的,和不为
    1,的两组,这样每组异或,就可以获得相应的数字。

代码如下:

class Solution {
public:
    void FindNumsAppearOnce(vector<int> data,int* num1,int *num2) {
         int len = data.size(); 
        if( len < 2 ){
            return ;
        }
        
        int k = 0;
        for(int i=0;i<len; i++){
            k ^= data[i];
        }
        
        int index = fisrtIndexOf1(k);
        *num1 = *num2 = 0;
         for(int i=0; i<len ; i++){
             if((data[i] >> index)&0x1){
                 *num1 ^= data[i]; 
             }else {
                 *num2 ^= data[i];
             }
             
         }
        
    }
    
    
    int fisrtIndexOf1(int num){
       
        int index = 0;
        while( num  ){
            if(num &(0x1))
                return index;
            
             num = num>>1;
             ++index;
        }
        return -1;
    }
    
    
};







posted on 2019-10-31 00:44  盛夏落木  阅读(167)  评论(0编辑  收藏  举报

导航