本题的解法已经藏在示例1了。考虑第2位,4、14为1,2为0,那么其二进制对应位的不同数量就是2,尝试扩展该示例使得更清晰。
[4,2,4,2,4],那么仅考虑第二位(按4位计算)那么就是1-0-1-0-1,那么但就这一位考虑来说应当是6,也就是不同位数量是2*3。因此我们可以采用一个逐个位算法。而且可以先采用统计的策略尽量减小重复计算。
class Solution:
def totalHammingDistance(self, nums: List[int]) -> int:
from collections import Counter
if len(nums)<=1:
return 0
d=Counter(nums)
ret=0
for k in range(32):
b=1<<k
cnt1=cnt0=0
for n in d.keys():
if n&b:
cnt1+=d[n]
else:
cnt0+=d[n]
ret+=cnt0*cnt1
return ret