天天看點

leetcode 461. 漢明距離這裡有leetcode題集分類整理!!!

這裡有leetcode題集分類整理!!!

題目難度:簡單

題目描述:

leetcode 461. 漢明距離這裡有leetcode題集分類整理!!!

方法一:通過位運算,加與運算記述

解題思路:

要計算兩個數字二進制位數不同的地方,隻需要先計算出兩個數的異或值,即可,然後通過位運算記錄每個位置上面不等于一的情況。

code:

class Solution {
    public int hammingDistance(int x, int y) {
        int s = x ^ y;
        int ans = 0;
        while (s != 0) {
            ans += s & 1;
            s >>= 1;
        }
        return ans;
    }
}
           

方法二:使用包裝類自帶的函數進行計數

解題思路:

Java 中 Integer 包裝類自帶的 bitCount 函數可以對二進制中1的個數進行傳回,就可以對方法一進行優化

code:

class Solution {
    public int hammingDistance(int x, int y) {
        return Integer.bitCount(x ^ y);
    }
}
           

方法三:Brian Kernighan 算法

算法介紹: 這個算法的意思是,對任何一個數 n nn,n & ( n − 1 ) n&(n-1)n&(n−1)的結果是n nn的比特位最右端的1變為0的結果。例如,n = 12 , n − 1 = 11 , 11 & 12 = 8 n=12,n-1=11,11&12=8n=12,n−1=11,11&12=8

leetcode 461. 漢明距離這裡有leetcode題集分類整理!!!

code:

class Solution {
public int hammingDistance(int x, int y) {
        int s = x ^ y;
        int ans = 0;
        while (s != 0) {
            s &= s - 1;
            ans ++;
        }
        return ans;
    }
}