题目链接:leetcode.
/*
36 / 46 个通过测试用例
超出时间限制
*/
class Solution {
int Hamming(int num1, int num2)
{
int tmp = num1 ^ num2;
int ans = 0;
while(tmp)
{
ans += (tmp & 1);
tmp = tmp >> 1;
}
return ans;
}
public:
int totalHammingDistance(vector<int>& nums) {
int N = nums.size();
int ans = 0;
for(int i = 0;i < N;++i)
{
for(int j = i + 1;j < N;++j)
{
ans += Hamming(nums[i], nums[j]);
}
}
return ans;
}
};
换成内置的计算二进制数中1个数的方法__builtin_popcount(),还是超时
看来暴力果然是不行的
/*
41 / 46 个通过测试用例
*/
class Solution {
int Hamming(int num1, int num2)
{
return __builtin_popcount(num1 ^ num2);
}
public:
int totalHammingDistance(vector<int>& nums) {
int N = nums.size();
int ans = 0;
for(int i = 0;i < N;++i)
{
for(int j = i + 1;j < N;++j)
{
ans += Hamming(nums[i], nums[j]);
}
}
return ans;
}
};
计算所有数字在每一位上1出现的次数
对于第i位,共出现了c个1,则有n-c个0,在该位上这n个数字能贡献的汉明距离为c*(n-c)
循环遍历每一位,统计汉明距离
/*
执行用时:56 ms, 在所有 C++ 提交中击败了53.99%的用户
内存消耗:18.6 MB, 在所有 C++ 提交中击败了22.10%的用户
*/
class Solution {
public:
int totalHammingDistance(vector<int>& nums) {
int N = nums.size();
int ans = 0;
for(int i = 0;i < 30;++i)
{
int c = 0;
for(auto num : nums)
{
c += ((num >> i) & 1);//移位num不要移位1,不然计算出来的数大于1
//c += (num & (1 << i));
}
ans += c * (N - c);
}
return ans;
}
};
365

被折叠的 条评论
为什么被折叠?



