zoukankan      html  css  js  c++  java
  • 461. 汉明距离

    两个整数之间的汉明距离指的是这两个数字对应二进制位不同的位置的数目。
    给出两个整数 x 和 y,计算它们之间的汉明距离。
    
    注意:
    0 ≤ xy < 2^31.
    
    示例:
    输入: x = 1, y = 4
    输出: 2
    解释:
    1   (0 0 0 1)
    4   (0 1 0 0)
           ↑   ↑
    
    上面的箭头指出了对应二进制位不同的位置。

    【疑问】

    1.x,y最大2^31,如何把这么大的数字拆成二进制呢?

    考虑一下任意一个数字P,对于 0 ≥ P ≤ 2^31 ,转换成二进制后的二进制位数一定是不大于31位的(思考一下2^31这个数用二进制怎么表示),因此可以用长度为(31+1)的数组来表示这个数字P。

    2.如何按位遍历一个整数P呢?

    //伪代码
    for (int i = 0; i < 32; ++i) {   第i位: P & (1 << i) }
    //说明
    按位左移动 1<<i :相当于 1 * 2^i 运算
    按位与运算:两位同时为“1”,结果才为“1”,否则为0

    //验证:当P=10,二进制表示为1010
    迭代i{
    i=0; 1010 & 0001 = 0000
    i=1; 1010 & 0010 = 0010
    i=2; 1010 & 0100 = 0000
    i=3; 1010 & 1000 = 1000
    ... //之后到高位都是0
    }

    【其他解法分析】

    1.

    class Solution {
    public:
        int hammingDistance(int x, int y) {
            int res = 0, exc = x ^ y;
            for (int i = 0; i < 32; ++i) {
                res += (exc >> i) & 1;
            }
            return res;
        }
    };

    1.
    exc = x ^ y :先异或得到新的一组二进制数Q,对于Q中的每一位q
      q=1:对应二进制位不同
      q=0:对应二进制位相同
    2. res += (exc >> i) & 1;
      exc每次按位右移一位:相当于依次把每一位的数放在最低位上
      (exc>>1) & 1 :相当于删掉其他位而只保留最低位的数
      总结:达到按位遍历的效果

     2.python解法

    return bin(x ^ y).count('1')

     参考:http://www.cnblogs.com/grandyang/p/6201215.html

  • 相关阅读:
    AGC037F Counting of Subarrays
    AGC025F Addition and Andition
    CF506C Mr. Kitayuta vs. Bamboos
    AGC032D Rotation Sort
    ARC101F Robots and Exits
    AGC032E Modulo Pairing
    CF559E Gerald and Path
    CF685C Optimal Point
    聊聊Mysql索引和redis跳表
    什么是线程安全
  • 原文地址:https://www.cnblogs.com/remly/p/10058067.html
Copyright © 2011-2022 走看看