求Hamming距离综合,Hamming距离ji两个二进制数不相同位的个数的总和例如:二进制表示中,2是0010,4是0100,14是1110,则HammingDistance(2,4) + HammingDistance(2,14) + HammingDistance(4,14) = 2+2+2 = 6。
思路:求两个值的异或后算其中1的值
class Solution {
public:
int totalHammingDistance(vector<int>& nums) {
if(nums.size() < 2)
return 0;
int res=0;
for(int i = 0;i<nums.size();i++)
for(int j = i+1;j<nums.size();j++)
res += HammingDistance(nums[i],nums[j]);
return res;
}
int HammingDistance(int num1, int num2) {
int num = num1 ^ num2;
int count = 0;
for(int i=0; i < 31; i++) {
count += 1 & num;
num = num >> 1;
}
return count;
}
};
但这种方法效率很低,会超出时间无法通过,查看论坛上别人的代码,有一种方法直接统计所有数字的同一位1的个数count,然后这个位就会为总的Hamming距离贡献count*(nums.size-count),再相加所有位的这个值就可以得到总的Hamming距离。
class Solution {
public:
int totalHammingDistance(vector<int>& nums) {
int total = 0;
for(int i = 0;i<32;i++){
int bitcount = 0;
for(int j=0;j<nums.size();j++)
bitcount += (nums[j] >> i) & 1;
total += bitcount*(nums.size() - bitcount);
}
return total;
}
};