【LeetCode】461. 汉明距离

237 阅读1分钟

汉明距离

两个整数之间的汉明距离指的是这两个数字对应二进制位不同的位置的数目。

给出两个整数x和y,计算它们之间的汉明距离。 注意: 0≤x, y<231.

示例1

输入: x = 1, y = 4

输出: 2

解释:
1   (0 0 0 1)
4   (0 1 0 0)
       ↑   ↑
       
上面的箭头指出了对应二进制位不同的位置。

思路

  • 根据题目的意思就是求两个数字对应位置数字不同的位数,很自然的想到了这就是求两个数求异或的结果。
  • 此外,需要统计异或结果中1的数目。首先,我想到的是使用很“笨”的办法。具体操作是:求res=a^b,将res结果除以2,判断余数为1的个数。如解法1。
  • 更先进的办法是使用位运算的移位操作,实现位计数功能。具体操作是:求res=a^b,res的最低位和1求与,结果为1,则统计数加1,然后将res右移,这样res的最低位就被舍弃了,原来的次低位变成了最低位,以此类推,直到res为0则结束。如解答2。

解法1

func hammingDistance(x int, y int) int {
    result:=x^y // 两个数的异或结果表示两个数字对应位置数字不同的结果
    count:=0
    for result!=0{
        if result%2!=0{ // 统计余数为1的数目
            count++
        }
        result=result/2 // 不断除以2获取新的result
    }
    return count
}

解法2

func hammingDistance(x int, y int) int {
    result:=x^y // 两个数的异或结果表示两个数字对应位置数字不同的结果
    count:=0
    for result!=0{
        if result&1==1{ // 最低位和1求与,统计结果为1的数目
            count++
        }
        result=result>>1 // 不断右移获取新的最低位
    }
    return count
}