2022年 11月 9日

【LeetCode 461】汉明距离(Python)

一、题目

两个整数之间的汉明距离指的是这两个数字对应二进制位不同的位置的数目。
给出两个整数 x 和 y,计算它们之间的汉明距离。

注意:
0 ≤ x, y < 231.

示例:
输入: x = 1, y = 4
输出: 2

解释:
在这里插入图片描述
上面的箭头指出了对应二进制位不同的位置。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/hamming-distance
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

二、个人理解
对题目解释的汉明距离没有整明白,导致了前几次提交的错误。在这里对汉明距离的定义重新解释一下:针对于相同长度的两个二进制数,计算他们在相同位置数值不同的次数。

三、注意事项

  1. 因为给定的数是int十进制整型,所以需要先转换成二进制
  2. 因为给定的x和y在转换为二进制后可能长度不同,所以需要通过补充0将两个长度统一。
  3. 字符串不方便进行每一位的对比检查,所以我换成了列表的形式,可以通过索引处理。

四、代码

class Solution:
    def hammingDistance(self, x: int, y: int) -> int:
        x=list(bin(x).replace('0b',""))
        y=list(bin(y).replace('0b',""))
        z=len(y)-len(x)
        m=0
        for i in range(abs(z)):
            if z>0:
                x.insert(0,'0')
            else:
                y.insert(0,'0')

        for i in range(len(y)):
            if x[i] != y[i]:
                m+=1
        return m
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

在这里插入图片描述

  1. 缺点:代码太长,因为用到的循环过多,导致内存消耗过大。
  2. 优点:执行用时较短,超过了85%的用户。

五、别人的代码(更好的结果)

    return bin(x ^ y).count('1')
  • 1

网络上大多数人使用的都是这种方法,目前没有找的其他的解法,也没找到和我相同的解法。

这个方法只需要一行,太残暴了!!!其中x^y是异或运算,不同为1,相同为0,bin()的结果是01字符串,求结果01字符串中的’1’字符的个数,就是结果。
代码简洁清晰易懂,思路很好,我完全没想到用异或的方法,值得学习。
在这里插入图片描述
但这种方法也不是没有缺点,根据上图的运算结果,这种方法的用时要比我的方法长的多。只超过9%的用户,而我自己的那个方法超过了85%的用户。