汉明距离的计算

实质就是查找出两个二进制中 相同位置上数值不同的 位数

比如    100101

            111011

那么结果就为4 ,两个数 中间的四个位置上的数都不相同

我们分两步

1. 通过两个二进制数的异或可以 得到 相同位置上数值不同的位置为1,其他位置为0的数

比如: 100101 ^ 111011 = 11110

2. 通过上面的结果,我们就只需要计算出结果数中 为1 的个数即可

比如: 以上结果就是 4 个1

那么解法方式的区分就主要在于第2步

第一个方法,直接对结果数进行每次模2,判断是否为1,如果是,则累加结果变量,

并将结果数除上2,继续进行,直至结果数变为0,即可查出结果数中为1的个数

class Solution {
    public int hammingDistance(int x, int y) {
        int res = x ^ y;
        int count = 0;
        while(res != 0){
            int mod = res % 2;
            if(mod == 1){
                count++;
            }
            res /= 2;
        }
        return count;
    }
}

第二个方法, 就是循环遍历结果数,每次都与1进行与操作,即可获取结果数最右位是否为1,然后将结果数右移一位,以此类推继续判断,直至结果数变为0,

class Solution {
    public int hammingDistance(int x, int y) {
        // 异或获取结果数
        int res = x ^ y;
        // 定义结果变量
        int count = 0;
        // 循环遍历结果数
        while(res != 0) {
            // 每次与上1 获取最后边是否为1,进行累加
            count += (res & 1);
            // 结果数向右移一位
            res >>= 1;
        }
        // 返回结果变量
        return count;
    }
}

第三个方法,就是每次都去掉结果数最后边的1,就是将结果数与上结果数-1的数,累加结果变量,直至 结果数变成0

class Solution {
    public int hammingDistance(int x, int y) {
        // 异或获取 不同位的结果数
        int res = x ^ y;
        // 定义结果变量
        int count = 0;
        // 循环遍历结果数
        while(res != 0) {
            // 与上减去1的数去掉最后一位1
            res &= (res-1);
            // 结果变量累加
            count++;
        }
        // 返回结果变量
        return count;
    }
}

你可能感兴趣的:(数据结构与算法,leetcode,数据结构,算法)