两个整数之间的汉明距离指的是这两个数字对应二进制位不同的位置的数目。
给出两个整数 x 和 y,计算它们之间的汉明距离。
注意:
0 ≤ x, y < 231.
示例:
输入: x = 1, y = 4 输出: 2 解释: 1 (0 0 0 1) 4 (0 1 0 0) ↑ ↑ 上面的箭头指出了对应二进制位不同的位置。
思路一
class Solution { func hammingDistance(_ x: Int, _ y: Int) -> Int { var n = x ^ y var count = 0 while n != 0 { if ((n & 1) != 0) { count += 1 } n = n >> 1 } return count } }
备注:
- n = 0001 ^ 0100 = 0101 = 5 , 求韩明距离改为求 二进制 n = 0101 中 1 的个数。
- 按位与,n & 1 , 每次可以获得 n 的最后一位。计数加一。将 n 右移,左边加0。循环
- n = 0 时,停止计数。
思路二:效率更高一点
class Solution { func hammingDistance(_ x: Int, _ y: Int) -> Int { var n = x ^ y var count = 0 while n != 0 { count += 1 n = n & (n - 1) } return count } }
备注:
n = n & (n - 1) 一次去掉 n 最后的一个 1,例如 n = 1100 , n - 1 = 1011, n & (n - 1) = 1000
思路三:nonzeroBitCount 函数就是 swift 中,int属性,变为二进制后非0个数
class Solution { func hammingDistance(_ x: Int, _ y: Int) -> Int { var n = x ^ y return n.nonzeroBitCount } }
应用:
汉明距离是以理查德·卫斯里·汉明的名字命名的。在信息论中,两个等长字符串之间的汉明距离是两个字符串对应位置的不同字符的个数。换句话说,它就是将一个字符串变换成另外一个字符串所需要替换的字符个数。图片相似度检测。百度谷歌以图搜图功能的实现。