1. 程式人生 > 其它 >【LeetCode】第461題——漢明距離(難度:簡單)

【LeetCode】第461題——漢明距離(難度:簡單)

技術標籤:LeetCode題解leetcodejava異或布賴恩·克尼根演算法

【LeetCode】第461題——漢明距離(難度:簡單)

題目描述

兩個整數之間的漢明距離指的是這兩個數字對應二進位制位不同的位置的數目。

給出兩個整數 x 和 y,計算它們之間的漢明距離。

注意:
0 ≤ x, y < 231.

  1. 示例:
    輸入: x = 1, y = 4
    輸出: 2
    解釋:
    1   (0 0 0 1)
    4   (0 1 0 0)
    	   ↑   ↑
    
    上面的箭頭指出了對應二進位制位不同的位置。

來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/hamming-distance
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。

解題思路

思路一:數字整體異或,逐次移位查詢1的個數。

思路二:數字整體異或,用自帶方法查詢1的個數。

思路三:數字整體異或,使用布賴恩·克尼根演算法查詢1的個數,比思路一移位次數少。

因為我們只在乎數字整體異或後1的個數,因此如果有種方法能一下跳過兩個1中間的所有0那便是極好的思路。布賴恩·克尼根演算法就是這樣一種演算法,就是如果提供一個數字n,n與上 n-1 就能把從低位開始直到遇到第一個1的所有位均變為0,直到將這個數字變為0。

如10001000 & 10000111 = 10000000;10000000 & 01111111 = 00000000。分兩步將10001000變成了00000000,說明該數字有兩個1,也就是有兩位不一樣。

程式碼詳解

思路一:整體異或,逐位查詢1的個數

class Solution {
    public int hammingDistance(int x, int y) {
        int count = 0;		// 記錄1的個數
        int xor = x ^ y;	// 整體異或
        while(xor != 0) {	// 直到xor為0終止迴圈
            if((xor & 1) == 1) {	// 逐位遍歷,遍歷到1後count就+1
++count; } xor = xor >> 1; // 逐位移動 } return count; } }

思路二:整體異或,利用自帶方法數出1的個數

class Solution {
    public int hammingDistance(int x, int y) {
    	// 利用Integer的bitCount方法,數出整體異或後1的個數
        return Integer.bitCount(x ^ y);
    }
}

思路三:利用布賴恩·克尼根演算法查詢1的個數

class Solution {
    public int hammingDistance(int x, int y) {
        int count = 0;		// 記錄1的個數
        int xor = x ^ y;	// 數字整體異或
        while(xor != 0) {	// 直到xor為0終止迴圈
            xor = xor & (xor - 1);	// 這樣異或可以把從最低位到第一個1的所有位均變為0,也就是一下跳過多個0,而不是思路一那樣一個個地跳過0
            ++count;
        }
        return count;
    }
}

注意點

  • 既然找不同就說明得利用異或的機制,是一道簡單的題,但是布賴恩·克尼根演算法是著實被驚豔到了,膜拜大佬。