位運算的運用

如果一個數組中的數組成對出現,怎麼快速查找一個數組中唯一出現一次或出現奇數次的數字

  • 思路:通過位運算的異或的性質
    • 相同兩個數異或爲0
    • 與0異或的數結果不變
    • 異或滿足乘法交換律
int search(int a[],int len){
    int num = 0;
    for(int i = 0; i < len; i++){
        num ^= a[i];// 通過不斷的異或操作獲得出現奇數次的數
    }
    return num;
}

在一個數組中除兩個數字只出現1次外,其它數字都出現了2次, 要求儘快找出這兩個數字(百度面試題)

 這道題的難度就大了很多,對於我來說是很難想到如何快速的找出這兩個數,就在這裏記錄一下大神的解題思路
  • 按照第一題的解法,要採取異或操作,要把數組分成兩組,分別滿足只有一個數字只出現一次的情況,要怎麼分組呢??
  • 先要快速的找出這兩個數的不同之處,數值不同,但是很難入手。先通過將數組數字全部異或的方式,得到的結果是所要找的兩個數字的異或結果res,由於0^1=1,1^1=1,0^0=1,所以可以根據res的二進制數中位數爲1的信息進行判斷這兩個數的不同,進而將數組進行分組。
  • 將分組的數組進行遍歷異或獲取數字
int* search2(int a[],int len){
    int res[2] = {0,0};
    int t; 
    for( int i = 0; i < len; i ++){
        t ^= a[i];// 先獲取所查找的兩個數以後結果
    }

    int j;
    for(j = 0; j < sizeof(t); j ++){
        // 查找兩個數在二進制位上第幾位的位數不一樣
        if( ((t>>j) & 1) == 1 ) 
            break; 
    }

    for(int i = 0; i < len; i ++ ){
        // 根據上面所求的第幾位進行分組查找
        if( (a[i] >> j) & 1 ) res[0] ^= a[i];
        else res[1] ^= a[i];   
    }
    return res;
}

總結

  • 本篇是通過位運算進行解題的另一種思路,需要慢慢領會

最後

  • 位運算的用法真的很奇妙,不過就先告一段落,等有時間再好好研習一下

參考鏈接

http://blog.csdn.net/morewindows/article/details/8214003

發佈了24 篇原創文章 · 獲贊 5 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章