汉明距离
两个整数之间的汉明距离指的是这两个数字对应二进制位不同的位置的数目。
给出两个整数 x
和 y
,计算它们之间的汉明距离。
注意: 0 ≤ x
, y
< 231.
示例:
输入: x = 1, y = 4 输出: 2 解释: 1 (0 0 0 1) 4 (0 1 0 0) ↑ ↑ 上面的箭头指出了对应二进制位不同的位置。
我的思路
思路一
首先对两数进行异或处理,得到的数再算计算【位1的个数】。使用SWAR算法。
class Solution { public int hammingDistance(int x, int y) { int n = x ^ y; n = (n & 0x55555555) + ((n >> 1) & 0x55555555); n = (n & 0x33333333) + ((n >> 2) & 0x33333333); n = (n & 0x0F0F0F0F) + ((n >> 4) & 0x0F0F0F0F); n = (n * (0x01010101) >> 24); return n; } }
思路二
首先对两数进行异或处理,得到的数再算计算【位1的个数】。使用迭代移位的方法。时间复杂度为O(n)
class Solution { public int hammingDistance(int x, int y) { int n = x ^ y; int result = 0; for (int i = 0; i < 32; i++) { result += n & 1; if (i < 31) { n >>>= 1; } } return result; } }
参考答案
首先对两数进行异或处理,得到的数再算计算【位1的个数】。位1的个数获取方式有点新奇,是采用循环获取z&(z-1)
,循环次数既为输出个数。这种方案最大时间复杂度为O(n),最小可能时间复杂度为O(1)。
class Solution { public int hammingDistance(int x, int y) { int z = x^y; int count = 0; while(z!=0){ count++; z = z&(z-1); } return count; } }