官方的解法
然后再配上这个代码就一目了然了
class Solution {
public int totalHammingDistance(int[] nums) {
int len=nums.length;
int[] bitCount = new int[32];
if(len <= 1){
return 0;
}
for(int numIndex = 0; numIndex < len; numIndex++){
for(int bitIndex = 0; bitIndex < 32; bitIndex++){
bitCount[bitIndex] += nums[numIndex] & 1;
nums[numIndex] = nums[numIndex] >> 1;
if(nums[numIndex] == 0){
break;
}
}
}
int oneCount = 0;
for(int bitIndex = 0; bitIndex < 32; bitIndex++){
oneCount += bitCount[bitIndex] * (len - bitCount[bitIndex]);
}
return oneCount;
}
}
上边就是用bitCount [bitIndex] 从第0位累加到32位,分别记录数组中每个数字对应的二进制位,然后用官方提供的那种思维 t*(n-t)记录每一组的汉明距离,最后再把32组累加起来就是总的汉明距离了
int hammingDistance(int x, int y)
{
long long z = (x ^ y);
int ret = 0;
while (z != 0) {
z = (z & (z - 1));
ret++;
}
return ret;
}
int totalHammingDistance(vector<int>& nums)
{
int ret = 0, n = nums.size();
// 遍历所有的两两组合
for (int i = 0; i < n - 1; i++) {
for (int j = i + 1; j < n; j++) {
ret += hammingDistance(nums[i], nums[j]);
}
}
return ret;
}
这是属于暴力求解的方法
再看看官方的解法![在这里插入图片描述](https://img-blog.csdnimg.cn/20200507232753581.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2RlbGV0ZV9idWc=,size_16,color_FFFFFF,t_70)