LeeCode两个数之间海明距离的

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.

海明距离即是指将两个数字化成二进制数,然后相同权值位进行比较,每有一位数不同则累计加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:方法二和方法三其实都是用到了移位,因此没有本质上的区别

阅读更多
想对作者说点什么?
相关热词

博主推荐

换一批

没有更多推荐了,返回首页