牛オフネットワークトピック - 数字の配列は一度だけ表示されます

次のように説明したタイトル:

二つの数の整数型配列に加えて、他の数字が二回表示されます。これら二つの数字は1度だけ表示を見つけるためにプログラムを書いてください

問題を解決するための主要なアイデア

  1. 排他的OR演算、二つの同一の数字、0ようにして得られた排他的論理和演算の結果、アレイは、一度だけ出現数、他の数は、二回存在する場合
    には、排他的OR動作原理によれば、すべての数は、排他的又はアレイであってもよいです見つけることができ、これは一度だけデジタル表示されます

  2. 二つの数だけ配列一度表示された場合、アレイは2つのグループに分けることができる、唯一の番号を含む各グループは一度だけ表示されます。どのような配列は、サブアレイに分割されるのだろうか?
    アレイの結果のすべての数字は確かに排他的OR 0、この数が1に等しいビットから抽出することができるではない。このビットが1であり、ないと、アレイは、全てのアレイに分割することができる
    2 1の各ように、 XOR基は、対応する番号を得ることができます。

コードは以下の通りであります:

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;
    }
    
    
};






おすすめ

転載: www.cnblogs.com/wanshuafe/p/11768985.html