LeetCode 461 - 汉明距离


文章目录

摘要

汉明距离这道题,属于那种题目极短、考点极准的类型。

表面看是在让你数二进制里有多少位不一样,但实际上是在考你对 位运算的理解是否到位

如果你在写业务代码时对位运算有点"下意识躲开",那这道题正好是一个非常好的切入口。

描述

题目给你两个整数 xy,要求你算它们的 汉明距离

什么叫汉明距离?说人话就是:

把两个数都转成二进制,从低位到高位一位一位对比,有多少位不一样,就是多少。

举个最直观的例子:

复制代码
x = 1  -> 0001
y = 4  -> 0100

你会发现有两位不同,所以结果是 2

这类问题在实际开发中其实并不陌生,比如:

  • 判断两个配置标志位差异
  • 计算数据版本变更程度
  • 网络协议中校验位的差异判断

题解答案

这道题最标准、最推荐的解法只有一句话:

先做异或,再数 1 的个数

原因很简单:

  • 异或(XOR)有一个非常好的性质

    • 相同位:0
    • 不同位:1
  • 所以 x ^ y 的二进制中,有多少个 1,就是汉明距离

题解代码分析

为什么一定要用异或?

假设有两个位:

x y x ^ y
0 0 0
1 1 0
0 1 1
1 0 1

你会发现:

  • 异或的结果,刚好标记了所有"不同的位置"
  • 不需要你手动逐位比对

这是位运算里最"干净"的用途之一。

怎么数 1 的个数?

有两种常见方式:

  1. 循环右移,一位一位数
  2. 使用经典技巧:n & (n - 1) 消掉最低位的 1

这里我推荐第二种,既高效又优雅。

Swift 可运行 Demo 代码

swift 复制代码
import Foundation

class Solution {
    func hammingDistance(_ x: Int, _ y: Int) -> Int {
        var n = x ^ y
        var count = 0

        // Brian Kernighan 算法
        while n > 0 {
            n &= (n - 1)
            count += 1
        }

        return count
    }
}

代码逐步解析

swift 复制代码
var n = x ^ y

这一步是整个解法的核心。

  • n 的每一位为 1,代表 xy 在该位不同
swift 复制代码
while n > 0 {
    n &= (n - 1)
    count += 1
}

这段代码的作用是:

  • 每执行一次,都会把 n最右边的一个 1 变成 0
  • 执行多少次,就说明原来有多少个 1

这比"循环 32 次逐位判断"要高效得多,尤其在 1 很少的情况下。

示例测试及结果

swift 复制代码
let solution = Solution()

print(solution.hammingDistance(1, 4)) // 2
print(solution.hammingDistance(3, 1)) // 1
print(solution.hammingDistance(0, 0)) // 0
print(solution.hammingDistance(7, 10)) // 3

输出结果:

复制代码
2
1
0
3

完全符合预期。

与实际场景结合

汉明距离在工程里其实非常常见,只是你可能没注意到名字而已。

几个典型场景:

  1. 特征相似度计算

    • 比如权限位、开关位的差异判断
  2. 网络通信

    • 用来判断数据包头部变化
  3. 版本对比

    • 判断新旧配置差了多少个标志位
  4. 安全领域

    • 判断哈希结果的相似程度(基础概念)

这道题的解法,属于那种:

一旦你记住了,以后在代码里会经常用到。

时间复杂度

复制代码
O(k)

其中 kx ^ y 中 1 的个数。

最坏情况下(全是 1),也只是 32 次循环。

空间复杂度

复制代码
O(1)

只用了几个整型变量,没有任何额外数据结构。

总结

汉明距离这道题,非常适合作为:

  • 位运算入门题
  • 面试中"送分但容易写复杂"的题
  • 提醒自己:位运算并不难,而且很实用
相关推荐
wuweijianlove5 小时前
算法性能的渐近与非渐近行为对比的技术4
算法
_dindong5 小时前
cf1091div2 C.Grid Covering(数论)
c++·算法
AI成长日志5 小时前
【Agentic RL】1.1 什么是Agentic RL:从传统RL到智能体学习
人工智能·学习·算法
黎阳之光6 小时前
黎阳之光:视频孪生领跑者,铸就中国数字科技全球竞争力
大数据·人工智能·算法·安全·数字孪生
skywalker_116 小时前
力扣hot100-3(最长连续序列),4(移动零)
数据结构·算法·leetcode
6Hzlia6 小时前
【Hot 100 刷题计划】 LeetCode 17. 电话号码的字母组合 | C++ 回溯算法经典模板
c++·算法·leetcode
wfbcg7 小时前
每日算法练习:LeetCode 209. 长度最小的子数组 ✅
算法·leetcode·职场和发展
_日拱一卒7 小时前
LeetCode:除了自身以外数组的乘积
数据结构·算法·leetcode
计算机安禾7 小时前
【数据结构与算法】第36篇:排序大总结:稳定性、时间复杂度与适用场景
c语言·数据结构·c++·算法·链表·线性回归·visual studio
SatVision炼金士7 小时前
合成孔径雷达干涉测量(InSAR)沉降监测算法体系
算法