两个整数之间的汉明距离指的是这两个数字对应二进制位不同的位置的数目。给你两个整数x和y,计算并返回它们之间的汉明距离。
示例 1:
输入:x = 1, y = 4
输出:2
解释:
1 (0 0 0 1)
4 (0 1 0 0)
↑ ↑
上面的箭头指出了对应二进制位不同的位置。
示例 2:
输入:x = 3, y = 1
输出:1
利用位运算异或^,那么输入位不同的距离输出结果为1,即计算数字对应二进制位不同位置数目时只需要统计两数异或后1的个数。每次x和y进行异或后与1进行按位且运算,判断异或后数最右边是否为1,是1则统计下来,再利用右移运算符将最右边数舍去,重复下去直到s等于0。
int hammingDistance(int x, int y){
int s=x^y;
int ret=0;
while(s)
{
ret+=s&1;
s>>=1;
}
return ret;
}时间复杂度:O(logn)
空间复杂度:O(1)
算法优化:BK算法
上面移位计数法中若数字是(01100010)2
两个1之间还有3个0要多循环3次。若使用BK算法,将x和y异或后的数字s进行s&(s-1)那么两个1之间的0就可以绕过。提高了时间效力。
int hammingDistance(int x, int y){
int s=x^y;
int ret=0;
while(s)
{
s=s&(s-1);
ret++;
}
return ret;
}时间复杂度:O(logn)
空间复杂度:O(1)