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

[算法2]相似度度量算法

相似度算法是机器学习算法的最基础
  • whzhcahzxh
  • whzhcahzxh
  • 2014年05月03日 20:39
  • 1070

NYIST_2013寒假ACM集训队练习赛(2)

集训第二周周四,做出来了7道题目,题目非常水,还有几道没有A出来的也不难,完了花点时间水一下,a过的题目贴在这里。没有a的后面补上。 比赛链接:http://acm.hust.edu.cn/vj...
  • y990041769
  • y990041769
  • 2014年01月14日 19:04
  • 14142

Leetcode全数组问题

目录 1、编号2 Median of Two Sorted Arrays There are two sorted arrays A and B of size m and n respe...
  • wangxiaojun911
  • wangxiaojun911
  • 2014年02月06日 03:32
  • 6334

【Codeforces Round 336 (Div 2) B】【水题 前缀和】Hamming Distance Sum 双字符串所有位置匹配下的差异数之和

B. Hamming Distance Sum time limit per test 2 seconds memory limit per test 256 megabyte...
  • snowy_smile
  • snowy_smile
  • 2015年12月25日 11:46
  • 474

opencv:L1距离,L2距离,颜色失真(color distortion),汉明距离(hamming distance),LUT

#pragma once #include //! computes the L1 distance between two integer values template static inl...
  • ding977921830
  • ding977921830
  • 2016年06月03日 14:46
  • 935

Hamming Distance 汉明距离【各种算法】

引用:https://stackoverflow.com/questions/6389841/efficiently-find-binary-strings-with-low-hamming-dist...
  • vcvycy
  • vcvycy
  • 2017年12月20日 11:32
  • 33

【12月19日】LeetCode刷题日志(二):Hamming Distance

package com.njust.med.totalhammingdistance; /** * The Hamming distance between two integers is the...
  • Moon_treee
  • Moon_treee
  • 2017年12月19日 10:51
  • 25

LeetCode - Hamming Distance

LeetCode - Hamming Distance题目:The Hamming distance between two integers is the number of positions a...
  • crazy_sevn
  • crazy_sevn
  • 2017年07月30日 00:36
  • 73

leetcode--461 : Hamming Distance

The Hamming distance between two integers is the number of positions at which the corresponding bi...
  • PrayAllForYou
  • PrayAllForYou
  • 2017年01月06日 15:39
  • 202

UVa 729 The Hamming Distance Problem (全排列输出&小细节)

729 - The Hamming Distance Problem Time limit: 3.000 seconds http://uva.onlinejudge.org/index.php?op...
  • synapse7
  • synapse7
  • 2013年09月26日 22:19
  • 737
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Hamming Distance
举报原因:
原因补充:

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