1.题目
The Hamming distance between two integers is the number of positions at which the corresponding bits are different.
Now your job is to find the total Hamming distance between all pairs of the given numbers.
汉明距离:两个整数的二进制表示中不同位的数量
给一个列表的数字,求这些数字两两之间的汉明距离和。
Example:
Input: 4, 14, 2
Output: 6
4 is 0100, 14 is 1110, and 2 is 0010
HammingDistance(4, 14) + HammingDistance(4, 2) + HammingDistance(14, 2) = 2 + 2 + 2 = 6.
2.分析
首先,如果真的一对对计算汉明距离,结果肯定超时。所以要考虑另外的方式。
题目假设所有数字都在INT32范围内。也就是32个bit位。从每个bit位来考虑。
例如,最低bit位,对于列表A中的每个数字:
统计该位为1的有x个,为0的有(n-x)个。
那么这一bit位贡献的汉明距离为(n-x)*x, 因为该bit为0或为1的数字共有(n-x)*x中组合
按照上面的方法,依次计算其他bit位
3.代码
int totalHammingDistance(vector<int>& nums) {
int ans = 0;
for (int i = 0; i < 32; i++) {
int count = 0;
for (int n : nums) {
count += (n >> i) & 1;
}
ans += (nums.size() - count)*count;
}
return ans;
}