力扣每日一题:477.汉明距离总和 字符串矩阵与列表计数器 双解分析!

简介: 力扣每日一题:477.汉明距离总和 字符串矩阵与列表计数器 双解分析!

477.汉明距离总和


https://leetcode-cn.com/problems/total-hamming-distance/

难度:中等


题目:

两个整数的 汉明距离 指的是这两个数字的二进制数对应位不同的数量。

计算一个数组中,任意两个数之间汉明距离的总和。

注意:

  • 数组中元素的范围为从 0到 10^9。
  • 数组的长度不超过 10^4。


示例:

输入: 4, 14, 2
输出: 6
解释: 在二进制表示中,4表示为0100,14表示为1110,2表示为0010。
所以答案为:
HammingDistance(4, 14) + HammingDistance(4, 2) + HammingDistance(14, 2)
 = 2 + 2 + 2 = 6.


分析

如果看过我昨天的解题: 461.汉明距离

那么相信今天的题目,只需要简单思考下,就能解决。 昨天是计算两个数的汉明距离,今天无非多几个。

来一个打一个,来两个打一双,来多少都不够塞牙缝的。

2   (0 0 1 0)
4   (0 1 0 0)
14  (1 1 1 0)
     ↑ ↑ ↑

查看上图,末尾尾数都是0,不存在汉明距离,其他三位都分别存在0和1,那么这个多位该如何算?

让我们把相同的数放在一起 先这样[1] *[0,0],然后在看看一共有几种排列?

1的个数 * 0的个数 = 1的个数 * 总数 - 1的个数 = 2 3 * 2 = 6 用例通过。

好了,算法知道了,下来我们来构造矩阵,由于数组元素范围在0 ~ 10 ** 9,10 ** 9 < 2 ** 30.

所以我们构造一个最大1000行的列表,然后计算每一列汉明距离n * (length - n)

矩阵转置怎么快?zip(*matrix),转换为31 * 1000的矩阵在进行计算。


解题1 二维矩阵:

class Solution:
    def totalHammingDistance(self, nums):
        ret, ln = 0, len(nums)
        matrix = [bin(num)[2:].zfill(31) for num in nums]
        for row in zip(*matrix):
            n = row.count('1')
            ret += n * (ln - n)
        return ret

上面的方法我们最大可能会构造一个31 * 1000的矩阵,那么有没有拿空间换时间的方法呢?

答案是有的,我们维护一个长度为31的全零数组,然后将二进制的字符串进行倒序后,

判断每一位的结果追加至计数列表。最终循环计算列表的总和即可。


解题2 列表计数器:

class Solution:
    def totalHammingDistance(self, nums):
        count_list = [0] * 31
        ret, ln = 0, len(nums)
        for num in nums:
            for index, s in enumerate(bin(num)[2:][::-1]):
                if s == '1':
                    count_list[index] += 1
        for count in count_list:
            ret += count * (ln - count)
        return ret




相关文章
|
3月前
|
存储 算法 NoSQL
LeetCode第73题矩阵置零
文章介绍了LeetCode第73题"矩阵置零"的解法,通过使用矩阵的第一行和第一列作为标记来记录哪些行或列需要置零,从而在不增加额外空间的情况下解决问题。
LeetCode第73题矩阵置零
|
26天前
|
JavaScript
力扣3333.找到初始输入字符串Ⅱ
【10月更文挑战第9天】力扣3333.找到初始输入字符串Ⅱ
32 1
|
1月前
|
C++
Leetcode第43题(字符串相乘)
本篇介绍了一种用C++实现的字符串表示的非负整数相乘的方法,通过逆向编号字符串,将乘法运算转化为二维数组的累加过程,最后处理进位并转换为字符串结果,解决了两个大数相乘的问题。
24 9
|
1月前
|
算法 C++
Leetcode第59题(螺旋矩阵2)
这篇文章介绍了解决LeetCode第59题“螺旋矩阵II”的算法,通过C++编程实现按顺时针顺序填充一个n x n的正方形矩阵。
15 0
|
1月前
|
算法 C++
Leetcode第八题(字符串转换整数(atoi))
这篇文章介绍了LeetCode上第8题“字符串转换整数(atoi)”的解题思路和C++的实现方法,包括处理前导空格、正负号、连续数字字符以及整数溢出的情况。
17 0
|
1月前
【LeetCode 22】459.重复的子字符串
【LeetCode 22】459.重复的子字符串
28 0
|
1月前
【LeetCode 20】151.反转字符串里的单词
【LeetCode 20】151.反转字符串里的单词
19 0
|
1月前
【LeetCode 19】541.反转字符串II
【LeetCode 19】541.反转字符串II
20 0
|
1月前
【LeetCode 18】6.2.反转字符串
【LeetCode 18】6.2.反转字符串
14 0
|
3月前
|
存储 算法
LeetCode第43题字符串相乘
LeetCode第43题"字符串相乘"的解题方法,通过使用数组存储乘积并处理进位,避免了字符串转换数字的复杂性,提高了算法效率。
LeetCode第43题字符串相乘