1. 程式人生 > >【LeetCode】461 Hamming Distance

【LeetCode】461 Hamming Distance

hamming-distance

漢明距離指的是兩個數字的二進位制表示間對應位置的不同數字的個數。

解法一

直接解法:迴圈依次判斷xy的對應位是否相同,由異或判斷是否相同:

int hammingDistance1(int x, int y) {
    int count = 0;

    for (int i = 0; i < 32; ++i) {
        if ((x & (1 << i)) ^ (y & (1 << i))) {
            count++;
        }
    }

    return count;
}

解法二

解法一的提升版,直接將xy進行異或,再判斷結果裡1的個數:

int hammingDistance2(int x, int y) {
    int res, count = 0;

    res = x ^ y;

    for (int i = 0; i < 32; ++i) {
        if (res & (1 << i)) {
            count++;
        }
    }

    return count;
}

解法三

想要判斷一個數的二進位制裡有多少個1,還有一個更簡單的辦法:

int hammingDistance3(int
x, int y) { int res, count = 0; res = x ^ y; while (res) { count++; res &= (res - 1); } return count; }

假設一個數裡有N個1,那麼時間複雜度就是O(N),就不用迴圈全部的32位了,當然最壞情況還是32位都是1。

假如res=1101res-1=1100,他倆進行與操作,結果是1100,最後一位為0,也就是找到了第一個1,將其變為0。

然後res=1100res-1=1011,他倆進行與操作,結果是1000,從右數第3位為0,也就是找到了第二個1,將其變為0。

這樣一直進行到最後,每次都將最右邊的1變為0,直到res=0退出迴圈,就算找到了所有的1。

參考:

最後更新於2017年6月19日。