477. 汉明距离总和
思路:
最简单的暴力法超时,所以需要换一种思路。我们知道汉明距离就是两个数的不同位的个数,int类型为32位,那么如果要统计所有数之间的汉明距离之和,不妨我们把每个数都拆成32个位,然后一位一位的考虑他们的组合。
对于所有数的第i位,我们只用统计所有数该位为1和为0的个数,因为只有1和0相互组合的取异或才会为1(只有1和0相互组合才算是不同位),其实我们只用统计每一位1的个数,因为0的个数就是数组长减去1的个数:
public int totalHammingDistance(int[] nums) {
if(nums.length<=1) return 0;
int len=nums.length;
int[] sums=new int[32];
int x=0;
for(int i=0;i<len;i++){//统计每个二进制位上的1出现个数
for(int j=0;j<32;j++){
sums[j]+=nums[i]&1;
nums[i]=nums[i]>>1;
if(nums[i]==0) break;//该数没有位了
}
}
int sum=0;
for(int i=0;i<32;i++){//通过对每个二进制位上的1的个数和0的个数相乘,求和
sum+=sums[i]*(len-sums[i]);
}
return sum;
}