位运算+分类讨论
- 对于所有数组的每一位进行分类讨论,枚举所有数字的每一位进行统计
- 0与1异或得1,所以n个1和m个0,组合能得到n * m个1
时间复杂度$O(31N)$,空间复杂度$O(1)$
AC代码
class Solution {
public:
int totalHammingDistance(vector<int>& nums) {
int res = 0;
for (int i = 30 ; i >= 0 ; i --) {
int zero = 0, one = 0;
for (auto x : nums)
if (x >> i & 1) one ++;
else zero ++;
res += zero * one;
}
return res;
}
};