声明:小白总结,本意是记录自己的思路,不过希望能帮助别人,那就更好啦,若发现问题,欢迎指正,感谢!!
来源:力扣(LeetCode)
链接:461.汉明距离
题目
两个整数之间的汉明距离指的是这两个数字对应二进制位不同的位置的数目。
给出两个整数 x 和 y,计算它们之间的汉明距离。
注意:
0 ≤ x, y < 231.
输入: x = 1, y = 4
输出: 2
解释:
1 (0 0 0 1)
4 (0 1 0 0)
↑ ↑
上面的箭头指出了对应二进制位不同的位置
关于^的理解
// ^运算
1 ^ 1 = 0;
0 ^ 1 = 1;
a ^ a = 0;
两数相同运算结果为0,不同时运算结果为1;
^相当于无进位加法
并不是指二进制的某一位的运算,而是整个数的运算(由于我在将循环条件写成 while(m == 1),认为不同时就参与运算,而此时算的是整个数字的值,而不是某一位,即使右移,只要前面还有1存在,结果就不会是1,而只有当前面全为0时,结果为0,即使之前全部为1也不是1,所以循环条件因为 != 0 ,即前面不存在1了,循环结束)
右移位
这里采用右移位,每个位置都会被移动到最右边。移位后检查最右位的位是否为 1 即可。检查最右位是否为 1,可以使用取模运算(i % 2)或者 AND 操作(i & 1),这两个操作都会屏蔽最右位以外的其他位。
//测试
package easy;
public class L461 {
public static void main(String[] args) {
// TODO Auto-generated method stub
int x = 1, y = 4;
int m = x ^ y;
int count = 0;
while(m != 0) {
System.out.println(m);
if((m & 1) == 1) {
count++;
}
m = m >> 1;
}
System.out.println("**");
System.out.println(count);
}
}
// 结果
5
2
1
**
2
代码
//java
class Solution {
public int hammingDistance(int x, int y) {
int m = x ^ y;
int count = 0;
while(m != 0){
if((m & 1) == 1){
count++;
}
m = m >> 1;
}
return count;
}
}
感谢各位巨巨们的帮助,希望在记录分析题目的条件下算法能有所提升……