leetcode 5 月 28,每日一题477. 汉明距离总和
参考官方题解
两个整数之间的汉明距离指的是这两个数字对应二进制位不同的位置的数目。
对应数组 nums 中的某个元素 val,如果其二进制的第 i 位为 1,只需要统计 nums 中有多少元素的第 i 位为 0,就计算出了 val 与其他元素在第 i 位上的汉明距离之和。
假如第 i 位上共有 c 个 1,有 ( n − c ) (n-c) (n−c)个 0,那么该位上的汉明距离为 c ∗ ( n − c ) c*(n-c) c∗(n−c)
class Solution:
def totalHammingDistance(self, nums: List[int]) -> int:
# ans = 0
# for i in range(len(nums)):
# for j in range(i+1,len(nums)):
# # print(nums[i],nums[j])
# ans += bin(nums[i]^nums[j]).count('1')
# return ans
# 暴力破解果然会超时
# 转变思路,计算每一位的0,1
maxl = len(bin(max(nums)))-2
n = len(nums)
ans = 0
for i in range(maxl):
c = 0
for val in nums:
c += ((val >> i) & 1)
ans += c * (n - c)
# print(val, ans, c)
return ans