两个整数之间的汉明距离指的是这两个数字对应二进制位不同的位置的数目。
给出两个整数 x 和 y,计算它们之间的汉明距离。注意:0 ≤ x, y < 231.思路一:
循环移位,每次判断两个数的最后一位是否相等
1 class Solution { 2 public int hammingDistance(int x, int y) { 3 4 int cnt = 0; 5 // 循环31次,每次判断一个位置 6 for(int i = 0; i < 31; i++){ 7 cnt += (x & 1) ^ (y & 1); 8 x >>= 1; 9 y >>= 1;10 }11 return cnt;12 }13 }
leetcode执行用时:0 ms > 100.00%, 内存消耗:35.5 MB > 64.54%
复杂度分析:
时间复杂度:O(1),Java 中 Integer 的大小是固定的,处理时间也是固定的。 32 位整数需要 32 次迭代。
空间复杂度:O(1),使用恒定大小的空间。思路二:
1. 先用异或运算符求出x异或y的结果,这个异或运算符的结果的1的个数即是我们要求的汉明距离
2. 循环移位,每次取xor的最低位1 class Solution { 2 public int hammingDistance(int x, int y) { 3 int count = 0; 4 int xor = x ^ y; 5 while(xor != 0){ 6 count += xor & 1; 7 xor = xor >> 1; // xor右移一位 8 } 9 return count;10 }11 }
复杂度分析:
时间复杂度:O(1),Java 中 Integer 的大小是固定的,处理时间也是固定的。 32 位整数需要 32 次迭代。
空间复杂度:O(1),使用恒定大小的空间。思路三:
思路参考:
使用布赖恩·克尼根算法,xor & (xor - 1)即可移除xor最右边的那个1,省去了移除0的过程,减少了迭代次数
1 class Solution { 2 public int hammingDistance(int x, int y) { 3 int count = 0; 4 int xor = x ^ y; 5 while(xor != 0){ 6 count += 1; 7 xor = xor & (xor - 1); // 每次移除最右边的一个1 8 } 9 return count;10 }11 }
复杂度分析:
时间复杂度和空间复杂度都是O(1),但是迭代次数小于法一