题目
两个整数之间的汉明距离指的是这两个数字对应二进制位不同的位置的数目。
给出两个整数 x
和 y
,计算它们之间的汉明距离。
注意:
0 ≤ x
, y
< 2^31.
示例 :
输入: x = 1, y = 4
输出: 2
解释:
1 (0 0 0 1)
4 (0 1 0 0)
标签
栈;移位
解题思路
方法一:栈
将二进制数输入到栈中,然后再逐位比较统计。要特别注意,在pop的过程中,size会变化,所以要提前记录好原size长度。
方法二:移位
按位进行与操作,将其移位后,再进行比较。
代码
public class Leetcode461 {
public static void main(String[] args) {
int x = 1, y = 4;
System.out.println(hammingDistance(x, y));
}
//方法一:栈
public static int hammingDistance(int x, int y) {
int ans = 0;
//模拟栈
Deque<Integer> stack_x = new LinkedList<>();
Deque<Integer> stack_y = new LinkedList<>();
while (x != 0 || y != 0) {
stack_x.push(x % 2);
stack_y.push(y % 2);
x = x / 2;
y = y / 2;
}
//记录size长度,在pop过程中会动态变化,所以要提前记录
int size=Math.max(stack_x.size(), stack_y.size());
for (int i = 1; i <= size; i++) {
if (!stack_x.pop().equals(stack_y.pop())) {
ans++;
}
}
return ans;
}
//方法二:移位
public static int hammingDistance2(int x, int y) {
int sum = 0;
while (x != 0 || y != 0) {
if ((x & 1) != (y & 1)) {
sum++;
}
//无符号右移1位,高位补0
x = x >>> 1;
y = y >>> 1;
}
return sum;
}
}
来源:力扣(LeetCode)