461. 汉明距离

461. 汉明距离

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

注意:
0 ≤ xy < 231.

示例:

输入: x = 1, y = 4

输出: 2

解释:
1   (0 0 0 1)
4   (0 1 0 0)
       ↑   ↑

上面的箭头指出了对应二进制位不同的位置。

第一版代码: 就是直接求整数的二进制表达式, 又因为前两位是"0b", 从第三位开始截取有用的信息.又因为如果两个数差别的比较大可能显示的位数不同, 而进行了补充, 其实这是多余的, 并没有必要这样做

class Solution:
    def hammingDistance(self, x: int, y: int) -> int:
        a = bin(x)[2:]
        b = bin(y)[2:]
        bits = len(a) - len(b)
        if bits == 0:
            pass
        elif bits > 0:
            b = "0" * bits + b
        elif bits < 0:
            a  = "0" * (-bits) + a
        res = 0
        for i, j in zip(a, b):
            if i != j:
                res += 1
        return res

虽然是通过了, 但是效果很差需要改善

第二版代码: 第一版代码就是严格按照题意的表达来计算的, 其实有直接求异或的操作就直接求到了结果, 然后的工作就是求这个结果数据的二进制有多少个1了

class Solution:
    def hammingDistance(self, x: int, y: int) -> int:
        xor = x ^ y
        res = 0
        while xor:
            res += 1
            xor = xor & (xor - 1)
        return res

虽然没有质的提升, 但是我们需要掌握这种求一个数的二进制有多少个1 的方法, 为什么这样就可以求xor有多少个1 呢?

如果xor不为0, 那么他的二进制中肯定有至少一个1 的, 我们让res += 1  然后就是我们怎么消去了其中的一个1, 我们这里消去的就是最后的一个1 .仔细想想我们将xor- 1 就是讲最后一个1 变成了0, 然后将这个1 后面的都变成了1, 这样把这两个数求与操作就将这个1 化为了0

第三版代码: 另外一种求解二进制中多少个1 的方法

class Solution:
    def hammingDistance(self, x: int, y: int) -> int:
        xor = x ^ y
        res = 0
        while xor:
            if xor & 1:
                res += 1
            xor = xor >> 1
        return res

和上面的效果几乎是一样的, 这里的原理是: 每次只看最后一位是不是1 , 如果是那就res += 1  然后右移一位, 直到全部为0

第四版代码: 其实求到了xor就可以直接转换成str进行统计了

class Solution:
    def hammingDistance(self, x: int, y: int) -> int:
        xor = x ^ y
        res = bin(xor).count('1')
        return res

虽然时间上提升了很多, 而且好多大佬也是这么做的, 时间最短的大佬也是这么写的, 但是我认为使用到了count()这个内置的函数, 并不是很好, 还是自己写比较好

第五版代码

class Solution:
    def hammingDistance(self, x: int, y: int) -> int:
        xor = x ^ y
        xor = bin(xor)
        res = 0
        for ch in xor[2:]:
            if int(ch):
                res += 1
        return res

和前面的效果相当, 果然没有内置的效率高, 但是方法大致就这几种吧!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值