• [LeetCode] 461. Hamming Distance


    The Hamming distance between two integers is the number of positions at which the corresponding bits are different.

    Given two integers x and y, calculate the Hamming distance.

    Note:
    0 ≤ x, y < 231.

    Example:

    Input: x = 1, y = 4
    
    Output: 2
    
    Explanation:
    1   (0 0 0 1)
    4   (0 1 0 0)
           ↑   ↑
    
    The above arrows point to positions where the corresponding bits are different.
    

    这道我理解错了题意,理解成了两个不同位之间的距离,实际上要算的是number of positions at which the corresponding bits are different,也就是不同的位的数量

    下面是正确写法,然而不算我自己写出来的,我在看错题意而去搜其他人的做法的时候看到了这个

    先用异或找出两个数的二进制中不同的地方,然后数1的个数

    int hammingDistance(int x, int y) {
        int r = x ^ y;
        int count = 0;
        while (r != 0)
        {
            if (r & 1 == 1)
            {
                ++count;
            }
            r = r >> 1;
        }
    
        return count;
    }
    

    这道题在这里就结束了


    下面是我写的计算两个不同位之间距离的代码,以及当时不成熟的想法

    思路是先x ^ y, 得到一个新的数,里面的两个1就是两个数的二进制不同的地方(这里其实能看出我把题看错了,不可能都只有两个不同的地方)

    然后算出两个1的index,再减一下就是不同位之间的距离了(这里我又走了远路,上面正确答案里在一个循环里 &1,再加一个计数器就能解决这个问题了)

    下面这句代码可以提出x的最后一个1,把其他位全变成0

    int r = x & (-x);
    

    举个例子

    x 00010100
    -x(x按位取反+1) 11101100
    r = x & (-x) 00000100

    r的二进制中1的index用到了MIT公开课里的代码

    这段是用来算(log_2{(x)})的,也能用来算1的index

    const uint64_t deBruijn = 0x022fdd63cc95386d;
    const unsigned int convert[64] =
        { 0, 1, 2, 53, 3, 7, 54, 27,
        4, 38, 41, 8, 34, 55, 48, 28,
        62, 5, 39, 46, 44, 42, 22, 9,
        24, 35, 59, 56, 49, 18, 29, 11,
        63, 52, 6, 26, 37, 40, 33, 47,
        61, 45, 43, 21, 23, 58, 17, 10,
        51, 25, 36, 32, 60, 20, 57, 16,
        50, 31, 19, 15, 30, 14, 13, 12};
    
    r = convert[(r * deBruijn) >> 58];
    

    这是我当时的完整代码,并不能AC,但好歹学到了点位运算的知识

    int indexOfOne(int x)
    {
        int r = x & (-x);
        const uint64_t deBruijn = 0x022fdd63cc95386d;
        const unsigned int convert[64] =
            { 0, 1, 2, 53, 3, 7, 54, 27,
            4, 38, 41, 8, 34, 55, 48, 28,
            62, 5, 39, 46, 44, 42, 22, 9,
            24, 35, 59, 56, 49, 18, 29, 11,
            63, 52, 6, 26, 37, 40, 33, 47,
            61, 45, 43, 21, 23, 58, 17, 10,
            51, 25, 36, 32, 60, 20, 57, 16,
            50, 31, 19, 15, 30, 14, 13, 12};
    
        r = convert[(r * deBruijn) >> 58];
        return r;
    }
    
    int hammingDistance(int x, int y) {
        int r = x ^ y;
        int index_1 = indexOfOne(r);
        r = r >> (index_1 + 1);
        int index_2 = indexOfOne(r);
        return index_2 + 1;
    }
    

    References

  • 相关阅读:
    PostgreSQL 学习之使用psycopg2 操作之数据库不存在才创建
    终于还是离开这家公司了
    【转载】看完这篇文章,我奶奶都懂了https的原理
    PostgreSQL 函数学习
    Python 工作中比较实用的一些第三方库
    Python 获取对象的属性和方法—dir 函数
    Python 学习之type 函数的用法
    python 异常处理的基本语法
    pdb调试程序
    随机设置爬虫头部headers 信息
  • 原文地址:https://www.cnblogs.com/arcsinw/p/9395440.html
Copyright © 2020-2023  润新知