两个整数的 汉明距离 指的是这两个数字的二进制数对应位不同的数量。
计算一个数组中,任意两个数之间汉明距离的总和。
前一周在写毕业论文所以落下了一周的题,之后找时间补上吧。这周还要准备答辩所以也只是偶尔刷一刷题,会做的话就做一做,不会的话我就偷个懒嘿嘿
昨天的题目是计算两个整数的汉明距离,解题方法很简单:
class Solution:
def HammingDistance(self, x: int, y: int) -> int:
return bin(x^y).count('1')
今天如果使用暴力算法的话,就可以直接遍历计算总共的汉明距离:
class Solution:
def totalHammingDistance(self, nums: List[int]) -> int:
lenth = len(nums)
res = 0
for i in range(lenth):
for j in range(i, lenth):
res += bin(nums[i]^nums[j]).count('1')
return res
果然超时了哈哈
想到了以前做过的这种异或题,是按照 位 来遍历的,可以借鉴一下:
按照位数遍历数组中的每个数,统计当前位上为 “1” 的个数 count ,那么在该位上的汉明距离总和为 count*(len(nums)-count) 。遍历所有的位数即可总计总共的汉明距离。
class Solution:
def totalHammingDistance(self, nums: List[int]) -> int:
lenth = len(nums)
res = 0
L = len(format(max(nums), 'b')) - 1
for i in range(L, -1, -1):
count = 0
for n in nums:
count += (n >> i) & 1
res += count*(lenth-count)
return res