https://leetcode-cn.com/problems/total-hamming-distance/
思路:分开计算二进制每一位的贡献即可,有两种方法,第一种方法先计算二进制每一位上1的个数,然后再遍历数组统计:
class Solution {
public:
int totalHammingDistance(vector<int>& nums) {
int cnt[31]={0};
for(const int& ele:nums)
{
int tmp=ele,idx=0;
while(tmp)
{
if(tmp&1)
++cnt[idx];
tmp>>=1;
++idx;
}
}
int ans=0,n=nums.size();
for(const int& ele:nums)
{
int idx=0;
while(idx<30)
{
if(ele&(1<<idx))
ans+=n-cnt[idx];
else
ans+=cnt[idx];
++idx;
}
}
return ans>>1;
}
};
第二种方法,直接在外层循环枚举二进制的位数,内层利用数学知识统计:
class Solution {
public:
int totalHammingDistance(vector<int>& nums) {
int ans=0,n=nums.size();
for(int i=0;i<30;i++)
{
int cnt=0,val=1<<i;
for(const int &num:nums)
if(num&val)
++cnt;
ans+=cnt*(n-cnt);
}
return ans;
}
};