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.
海明距离即是指将两个数字化成二进制数,然后相同权值位进行比较,每有一位数不同则累计加1,最后的结果就是两个数之间的海明距离。在这道题目里面,要计算海明距离则是要对每一位的数字进行比较。那么有以下三种方法(或者说是两种,因为方法二三没有本质上的区别)
方法一:将输入的整数x,y先转变为二进制数,然后逐位进行比较。
①可以考虑用链表对输入的整数x进行逐位的存储。(因为链表可变长度,不像数组那样定下来具体大小之后就没法改变;而输入的整数需要用多少位二进制数进行表示也是不确定的)具体的过程是先建立节点,然后用x%2获得每一位该存储的值,对节点赋值之后别忘了执行x/2操作。同样的y也是这样转变。
②对链表的每个节点进行比较。(先定义一个整型dis对海明距离进行累计)二进制数储存完之后,链表的每一个节点都是之前整数x或者y的一位,读取他们的值进行比较,相同的话dis不变;不同则dis++;最后输出dis即可。
PS:方法一最容易想到,但过于麻烦不推荐使用,所以也就没有附上代码~有兴趣的帅哥美女可以尝试尝试链表操作。
方法二:先将输入的整数x,y进行位异或计算(一一得0,零零得0,一零得一,即是相同为1,不同为0),后用移位的方式统计异或结果中1的个数。
具体代码如下:
int hammingDistance(int x, int y) {
int z = x^y; //^为异或符号
int dis = 0;
while(z)
{
if(z&1) //判断z最后一位是否为1
dis++;
z=z>>1; //对z进行移位}
return dis;
}
方法三:先将输入的整数x,y进行位异或计算,后以取余方法统计异或结果中1的个数。
int hammingDistance(int x, int y) {
int z = x^y;
int dis = 0;
for(;z;z/=2) //z除以2则可以去掉最后一位
if(z % 2 == 1) //判断最后一位是否为1
dis ++;
return dis;
}
PS:方法二和方法三其实都是用到了移位,因此没有本质上的区别