【刷题笔记】461. 汉明距离

149 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第23天,点击查看活动详情

一、题目描述:

461. 汉明距离 - 力扣(LeetCode)

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

给你两个整数 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

二、思路分析:

从后向前比较二进制数,这样我们就可以从后向前比较x和y的每一位二进制数,获取x,y的末尾二进制我们只需要每次mod2就可以,如果不同ans++,然后x/=2,y/=2,继续循环比较,我们只需要控制循环在x>0&&y>0就可以。 对于x和y中多余的那个数字,我们只统计多余那部分的1的个数就行了。即统计mod2 == 1 的个数。

三、AC 代码:

class Solution {
    public int hammingDistance(int x, int y) {
        int ans = 0;
		while(x > 0 && y > 0) {
			if(x%2 != y%2) {
				ans++;
			}
			x /= 2;
			y /= 2;
		}
		while(x > 0) {
			if(x % 2 == 1) {
				ans++;
			}
			x /= 2;
		}
		while(y > 0) {
			if(y % 2 == 1) {
				ans++;
			}
			y /= 2;
		}
        return ans;
    }
}

四、总结:

利用异或的性质,(相同为0,不同为1),得到一个新的二进制数,下一步需要把这个二进制数中的1进行统计. 此时的问题就变成了: 统计二进制数中1的个数,此时就需要用到另一个二进制的特性, 一个二进制数和1相与,如果为1则它的末尾的数字是1,如果为0,则它的末尾的数字为0,此时利用这个性质,就可以获取1的数量:

范文参考:

【Nick】Hot一百题~ - 汉明距离 - 力扣(LeetCode)

《可以是小盖》汉明距离 go逐行注释 - 汉明距离 - 力扣(LeetCode)