问题
思路
这个题上来我先朴素的做法,结果TLE。其实也能想到,只不过没有想到更好的办法。餐卡了这篇文档的思路[Total Hamming Distance]得到的思路。
- 判断数组中所有元素的某一位
- 计算该位1的个数m
- 计算该位0的个数n
- 该位产生的hammingDistance个数m*n
重复上面过程直到所有位判断。
代码
/*
从每一位去考虑了:
每一位可能产生的hammingDistance有多少,因为本质就是对改位1的个数计算。
然后累加所有位的即可。
写几个demo就可以发现这个规律。
这个题没想到还是,样本分析的不够透彻。
其实,这种编程技巧前面也接触到了
*/
class Solution {
public:
int totalHammingDistance(vector<int>& nums) {
int ans = 0;
int sz = nums.size();
for( int i = 0, mask = 1; i < 32; ++i, mask <<= 1 ){
int m = 0; // number of 1 bits
int n = 0; // number of 0 bits
for( int i = 0; i < sz; ++i ){
if( nums[i] & mask ) ++m;
else ++n;
}
ans += (m*n);
}
return ans;
}
};