题目地址:
https://www.lintcode.com/problem/1217/description
给定一个长 n n n的数组 A A A,求其中数两两汉明距离之总和。
如果某个二进制位中是 1 1 1的数有 x x x个,那么该二进制位对汉明距离总和的贡献就是 x ( n − x ) x(n-x) x(n−x)。所以只需统计每个二进制位的 1 1 1的个数即可。代码如下:
public class Solution {
/**
* @param nums: the gievn integers
* @return: the total Hamming distance between all pairs of the given numbers
*/
public int totalHammingDistance(int[] nums) {
// Write your code here
int[] cnt = new int[32];
for (int x : nums) {
int pos = 0;
while (x != 0) {
cnt[pos++] += x & 1;
x >>= 1;
}
}
int res = 0;
for (int x : cnt) {
res += x * (nums.length - x);
}
return res;
}
}
时间复杂度 O ( n ) O(n) O(n),空间 O ( 1 ) O(1) O(1)。