这道题解法很巧妙,background knowledge:
- int 是32为bits
- 与运算规则 1 & 0 = 0
- 右移操作<<
我们用一个初始化为1的掩码来协助我们计算几个input num每一位上总共有几个1几个0, mask = 1 时最后四位是0001. 我们分别用num & mask, 如果num的第32位是1的话,num & mask的结果就会是0000....0001还是1, 如果num的第32位是0的话,num & mask的结果会是0000....0000也就是0; 但是我们能否一直以num & mask == 1 ? 与否来计算1个的个数呢?不能。因为mask右移后会变化,导致与运算的结果会得到0000....0010, 0000....0100,这些值都不等于1. 所以我们统计时直接统计0的个数,也就是num & mask == 0 与否来判断0的个数。因为无论mask如何左移, num & mask == 0都表示在那一位上num一定是0.
class Solution {
public int totalHammingDistance(int[] nums) {
int res = 0;
int mask = 1;
for (int i = 0; i < 31; i++){
int one = 0;
int zero = 0;
for (int num : nums){
if ((num & mask) == 0){
zero++;
} else {
one++;
}
}
res += zero*one;
mask <<= 1;
}
return res;
}
}