一、汉明距离
将 x y异或的结果和1做与运算,能算出低位的x y是否相同(都是0,或1)
class Solution {
public int hammingDistance(int x, int y) {
int result=0;
while(x!=0||y!=0){
if(((x^y)&1)==1) result++;//x y低位不同,计数+1
// x y带符号右移
x>>>=1;
y>>>=1;
}
return result;
}
}
二、汉明距离总和。
遍历数组会超时。大神们的思路很巧妙,每次计算nums数组中所有数的低位0和1的个数,然后把nums数组中的数右移,继续循环算低位。 汉明距离即1的个数*0的个数,count表示1的个数,nums.length-count即0的个数。
class Solution {
public int totalHammingDistance(int[] nums) {
int res=0;
for(int i=0;i<32;i++){
int count=0;
for(int j=0;j<nums.length;j++){
if((nums[j]&1)==1){
count++;//计算1的个数
}
nums[j]>>=1;//当前数右移一位
}
res+=count*(nums.length-count);//1的个数*0的个数
}
return res;
}
}