汉明距离很好求,但是这个题如果用汉明距离暴力做肯定是不行的,会超时。所以此题其实要换一个角度,用数学方法来做。
因为一共有32位,假设有一位有x个1,那么这一位上的汉明距离总和就是x(n-x),按照这个思路,我们就可以求得结果,将位作为外循环比较好做。
class Solution {
public:
int totalHammingDistance(vector<int>& nums) {
int ans = 0, tmp = 0, n = nums.size();
for(int i=0;i<32;i++)
{
tmp = 0;
for(auto &num: nums)
{
if(num == 0)continue;
if(num&1)tmp++;
num >>= 1;
}
ans += tmp*(n-tmp);
}
return ans;
}
};