Hamming Distance

转载 2017年01月03日 06:10:09

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 ≤ xy < 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.

 

这道题让我求两个数字之间的汉明距离,题目中解释的很清楚了,两个数字之间的汉明距离就是其二进制数对应位不同的个数,那么最直接了当的做法就是按位分别取出两个数对应位上的数并异或,我们知道异或的性质上相同的为0,不同的为1,我们只要把为1的情况累加起来就是汉明距离了,参见代码如下:

 

解法一:

复制代码
class Solution {
public:
    int hammingDistance(int x, int y) {
        int res = 0;
        for (int i = 0; i < 32; ++i) {
            if ((x & (1 << i)) ^ (y & (1 << i))) {
                ++res;
            }
        }
        return res;
    }
};
复制代码

 

我们可以对上面的代码进行优化,我们可以一开始直接将两个数字异或起来,然后我们遍历异或结果的每一位,统计为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;
    }
};
复制代码

 

经过副博主@fantasywindy的提醒,上面的遍历每一位的方法并不高效,还可以进一步优化,假如数为num, num & (num - 1)可以快速地移除最右边的bit 1, 一直循环到num为0, 总的循环数就是num中bit 1的个数。参见代码如下:

 

解法三:

复制代码
class Solution {
public:
    int hammingDistance(int x, int y) {
        int res = 0, exc = x ^ y;
        while (exc) {
            ++res;
            exc &= (exc - 1);
        }
        return res;
    }
};
复制代码

 

我们再来看一种递归的写法,非常的简洁,递归终止的条件是当两个数异或为0时,表明此时两个数完全相同,我们返回0,否则我们返回异或和对2取余加上对x/2和y/2调用递归的结果。异或和对2取余相当于检查最低位是否相同,而对x/2和y/2调用递归相当于将x和y分别向右移动一位,这样每一位都可以比较到,也能得到正确结果,参见代码如下:

 

解法四:

复制代码
class Solution {
public:
    int hammingDistance(int x, int y) {
        if ((x ^ y) == 0) return 0;
        return (x ^ y) % 2 + hammingDistance(x / 2, y / 2);
    }
};
复制代码

 

参考资料:

https://discuss.leetcode.com/topic/72089/java-3-line-solution

https://discuss.leetcode.com/topic/72093/java-1-line-solution-d

https://discuss.leetcode.com/topic/72289/0ms-c-two-line-solution

相关文章推荐

leetcode_461. Hamming Distance 计算汉明距离,按位异或运算,计算整数的二进制表示中1的个数 java

题目: The Hamming distance between two integers is the number of positions at which the correspon...

LeetCode461 Hamming Distance java The Hamming distance between two integers is the number osoluotion

题目要求: The Hamming distance between two integers is the number of positions at which the corresp...

汉明距离(Hamming distance)

两个字符串之间的汉明距离是指两个相等长度的字符串,对应位置上不同字符的个数。例子如下:A=abcdefB=adddef则A与B之间的汉明距离是2,因为第二位和第三位不同。...
  • lgfun
  • lgfun
  • 2016年09月09日 11:51
  • 3667

LeetCode之Hamming Distance

看到异或运算的那一刹那我就傻眼了——有这么好用的办法为啥我就没想到呢?异或运算之后,我们只要数一数结果里面有多少个1就行了,因为只有两个数相同位的值不同结果才是1,这就是核心思路。 然后就是如何去数结...

【LeetCode】461. Hamming Distance (java实现)

原题链接https://leetcode.com/problems/hamming-distance/原题The Hamming distance between two integers is th...
  • styshoo
  • styshoo
  • 2017年01月05日 22:51
  • 2855

Hamming Distance汉明距离

引子 第一次听说汉明距离来源于一次面试,当时问了个题目: 已知一个无符号的二进制整数n,int长度,求二进制中1的个数 方法1:直接数 最简单的方法,挨个挨个数,声明一个计数变量,当尾数为1时加1,...

Hamming Distance

The Hamming distance between two integers is the number of positions at which the creesponding bits ...

Leetcode Total Hamming Distance 477

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

HUST 1404 Hamming Distance

Description Have you ever heard of the Hamming distance. It is the number of positions for which ...

对tomcat来说,每一个进来的请求(request)都需要一个线程,直到该请求结束。

对web应用开发者来说,我们很关心应用可同时处理的请求数,以及响应时间。应用本身和它运行在其中的web容器是两个很重要的影响因素。 对tomcat来说,每一个进来的请求(request)都需要一个线...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Hamming Distance
举报原因:
原因补充:

(最多只允许输入30个字)