找出數(shù)組中N個(gè)出現(xiàn)1(或奇數(shù)次)次的數(shù)字

1,題目描述:在一個(gè)數(shù)組中有一個(gè)數(shù)出現(xiàn)了1次(奇數(shù)次),其余數(shù)都出現(xiàn)了2次(偶數(shù)次),找到這個(gè)數(shù)~

方法:異或運(yùn)算為基礎(chǔ) , 偶數(shù)個(gè)一樣的數(shù)異或?yàn)?, 異或符合交換律 ,所以只需要把所有數(shù)組中所有數(shù)字異或一次就可以了

void findChar1(int a[] ,int l ,int *x){//有一個(gè)出現(xiàn)一次或者奇數(shù)次的情況
    
    int res = 0;
    for (int i = 0 ; i < l; i++) {
        res = res^a[i];
    }
    printf("%d",res);
    *x = res;
    
}

2..題目描述:在一個(gè)數(shù)組中有兩個(gè)個(gè)數(shù)出現(xiàn)了1次(奇數(shù)次),其余數(shù)都出現(xiàn)了2次(偶數(shù)次),找到這兩個(gè)數(shù)~

方法:由于有兩個(gè)數(shù)字出現(xiàn)了奇數(shù)次,并且這兩個(gè)數(shù)字不同,所以將數(shù)組中每個(gè)數(shù)異或起來(lái)的結(jié)果不為0;并且若結(jié)果的某一位為1,則必然是因?yàn)閮蓚€(gè)數(shù)在這一位的值不同??紤]這一位,我們把數(shù)組中這一位為0和1的元素分別作異或運(yùn)算,則結(jié)果就分別為這兩個(gè)數(shù)的值。

void findChar2(int a[],int l , int *x , int *y){//有兩個(gè)出現(xiàn)一次/奇數(shù)次的情況
    int res = 0;
    for (int i = 0 ; i < l; i++) {
        res = res^a[i];
    }
    
    int a1 = 0;
    int a2 = 0;
    int k = 0;
    
    while ( res ){
        if (res%2 == 1) {
          for (int i = 0; i<l ; i++) {
               if ((a[i] >> k)%2 == 1) {
                  a1 = a1 ^ a[i];
               }else{
                  a2 = a2 ^ a[i];
               }
           }
            break;
        }
        
        res = res >> 1;
        k++;
    }
   
    *x = a1;
    *y = a2;
    
    
}

3.題目描述:在一個(gè)數(shù)組中有三個(gè)數(shù)出現(xiàn)了1次(奇數(shù)次),其余數(shù)都出現(xiàn)了2次(偶數(shù)次),找到其中一個(gè)數(shù)~

方法:如果數(shù)都是成對(duì)出現(xiàn)的話(huà),那么在每一位上的異或結(jié)果都應(yīng)該是0,考慮3個(gè)數(shù)在某位上的值
3個(gè)0,3個(gè)1,兩個(gè)0一個(gè)1,一個(gè)0兩個(gè)1;依然采用題目2中的方法,將位數(shù)為0和1的分別異或,然后找到只有一個(gè)非成對(duì)出現(xiàn)數(shù)的異或結(jié)果,這個(gè)結(jié)果即為某一個(gè)非成對(duì)出現(xiàn)的數(shù)。由于3個(gè)數(shù)不相等所以必有兩個(gè)0一個(gè)1,一個(gè)0兩個(gè)1這種情況出現(xiàn)。
排除3個(gè)0或3個(gè)1的這種情況的方法,就是看另外的一個(gè)異或集是否為0,比如某一位為0的數(shù)組異或集不為0,而為1的數(shù)組異或集為0,則該位為1的異或集中肯定沒(méi)有非成對(duì)出現(xiàn)的元素。

void findChar3(int a[] , int l , int *x){ ////有三個(gè)出現(xiàn)一次/奇數(shù)次的情況找其中一個(gè)數(shù)
    
    int res = 0;
    for (int i = 0 ; i < l; i++) {
        res = res^a[i];
    }
    
    int a1 = 0;
    int a2 = 0;
    int counta1 = 0;
    int counta2 = 0;
    int k = 0;
    
    while ( res ){
            for (int i = 0; i<l ; i++) {
                
                if ((a[i] >> k)%2 == 1) {
                    counta1++;
                    a1 = a1 ^ a[i];
                }else{
                    counta2++;
                    a2 = a2 ^ a[i];
                }
                
                if(counta1%2 == 1){
                    if (a2 != 0) {
                        *x = a1;
                        return;
                    }
                }else {
                    if (a1 != 0) {
                        *x = a2;
                        return;
                    }
                }
                
            }
        res = res >> 1;
        k++;
    }  
}


如果需要找到全部的三個(gè)元素,那這個(gè)方法就不行了,必須采用另外的方法。
比如 如果三個(gè)元素為( 101,110,100 ) ,那么永遠(yuǎn)只能找到101和110這兩個(gè)數(shù)而找不到100....

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容