汉明距离
两个整数之间的 汉明距离 指的是这两个数字对应二进制位不同的位置的数目。
给你两个整数 x 和 y,计算并返回它们之间的汉明距离。
示例 1:
输入:x = 1, y = 4
输出:2
解法一:
思路比较简单,就是转换成二进制,比较对应的二进制位一不一样,对数字进行取与操作可以得到相应的二进制位,之后再对其进行/2,反复操作直到该数字等于0。
做题的时候困住的地方就是不知道什么时候while循环该结束,应该是当两个数中较大的那个数已经被转换完成,所以一开始先进行判断,找出max。
由于不需要存储转换之后的二进制序列,所以边转换便比较就好。
class Solution {
public int hammingDistance(int x, int y) {
int flag=0;
int max=0,min=0;
if(x>y)
{max = x;
min = y;
}
else
{max = y;
min = x;
}
while(max!=0){
if(max%2!=min%2)
flag++;
max/=2;
min/=2;
}
return flag;
}
}
看了官方题解,好几种方法都可以
解法二:
内置计数功能:计算二进制中1的数量。
可以对x,y进行异或然后得到1的个数即可。
class Solution {
public int hammingDistance(int x, int y) {
return Integer.bitCount(x^y);
}
}
一行代码就可以解决问题。。。。
解法三:
移位操作
将x和y先进行异或操作,然后得到二进制序列,当最后一位是1的时候,计数器加1,并且要移位(移位是一直在进行,直到移位后的数变成0)
flag += a&1;实现了当最后一位是1的时候,flag++。
class Solution {
public int hammingDistance(int x, int y) {
int a = x^y;
int flag=0;
while(a!=0){
flag += a&1;
a >>= 1;
}
return flag;
}
}
解法四:
还有一个就是Brian Kernighan 算法。
对上面的解法进行分析可以得到,其实只是计算异或之后得到的1的个数,令f(x)=x & (x−1),那么f(x)就是x除去二进制中最右端的1的操作,可以让异或之后的数值进行f(x)操作,看一共删除了几次1,就可以得到1的不同个数。(每删除一次就要计数器加1)
class Solution {
public int hammingDistance(int x, int y) {
int a = x^y;
int flag=0;
while(a!=0){
a &= (a-1);
flag++;
}
return flag;
}
}
最后这个方法的确比较简洁,但是就是比较难想到。
今日的每日一题好多解法啊,关于数的运算还是要找好规律,积累经验。