461. 汉明距离

103 阅读1分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第22天,点击查看活动详情

一、题目描述:

461. 汉明距离

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

给你两个整数 x 和 y,计算并返回它们之间的汉明距离。

示例 1:

输入:x = 1, y = 4
输出:2
解释:
1   (0 0 0 1)
4   (0 1 0 0)
       ↑   ↑
上面的箭头指出了对应二进制位不同的位置。

示例 2:

输入:x = 3, y = 1
输出:1

提示:

  • 0 <= x, y <= 2^31 - 1

二、思路分析:

看到两个整数二进制位的不同的位数,就想到是位运算,那位运算怎么算呢?

算不同,第一反应是按位计算异或,然后同时将两个数右移一位,但是按位计算异或怎么搞呢(当时想整体两个数异或,然后移位完全不行),就一直没想到。。。就想那按位看每一位是否相等吧,怎么比较呢,然后想到和1进行相与,这样1每次只代表一位,这样每次我也只对比一位,然后如果两个数和1相与的结果不同,那么count+1,然后每次都要将两个数同时右移一位

但是又想,那二进制位数长度不同怎么办,这个循环的结条件是什么呢,肯定不能是两个都不为0,有可能有一个数上来就一两次次对比之后就为0了,而另一个数还很大,那么就去想循环的结束条件,那肯定是两个数都为0的时候就结束吧,那这样一想,循环的条件就出来了,只要这两个数,有一个不为0,那就要继续下去:while x != 0 or y != 0,那么也就是while x or y

三、AC 代码:

class Solution:
    def hammingDistance(self, x: int, y: int) -> int:
        count = 0
        
        while x or y:
            if (x & 1) != (y & 1):
                count += 1
            '''同时将x和y向右移一位,而且不能是x>>1,必须是x=x>>1'''
            x = x >> 1
            y = y >> 1
        
        return count

四、总结:

异或运算符(^):按位异或,将两个数据所有的位进行异或操作并返回,1^1=0 0^0=0 1^0=1
移位操作符(>> <<):>> 右移, << 左移 不要用反
按位与(&):1&1=1 1&0=0 0&0=1