​461. 汉明距离​

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

注意:
0 ≤ ​​​x​​​, ​​y​​ < 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

461. 汉明距离_LeetCode

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

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

461. 汉明距离_算法_02

虽然没有质的提升, 但是我们需要掌握这种求一个数的二进制有多少个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

461. 汉明距离_汉明距离_03

和上面的效果几乎是一样的, 这里的原理是: 每次只看最后一位是不是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

461. 汉明距离_数据_04

虽然时间上提升了很多, 而且好多大佬也是这么做的, 时间最短的大佬也是这么写的, 但是我认为使用到了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

461. 汉明距离_算法_05

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