解放双手!鸣潮自动化工具ok-ww轻松实现智能后台挂机
2026/7/1 14:46:18
汉明距离这道题,属于那种题目极短、考点极准的类型。
表面看是在让你数二进制里有多少位不一样,但实际上是在考你对位运算的理解是否到位。
如果你在写业务代码时对位运算有点“下意识躲开”,那这道题正好是一个非常好的切入口。
题目给你两个整数x和y,要求你算它们的汉明距离。
什么叫汉明距离?说人话就是:
把两个数都转成二进制,从低位到高位一位一位对比,有多少位不一样,就是多少。
举个最直观的例子:
x = 1 -> 0001 y = 4 -> 0100你会发现有两位不同,所以结果是2。
这类问题在实际开发中其实并不陌生,比如:
这道题最标准、最推荐的解法只有一句话:
先做异或,再数 1 的个数
原因很简单:
异或(XOR)有一个非常好的性质
所以x ^ y的二进制中,有多少个1,就是汉明距离
假设有两个位:
| x | y | x ^ y |
|---|---|---|
| 0 | 0 | 0 |
| 1 | 1 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
你会发现:
这是位运算里最“干净”的用途之一。
有两种常见方式:
n & (n - 1)消掉最低位的 1这里我推荐第二种,既高效又优雅。
importFoundationclassSolution{funchammingDistance(_x:Int,_y:Int)->Int{varn=x^yvarcount=0// Brian Kernighan 算法whilen>0{n&=(n-1)count+=1}returncount}}varn=x^y这一步是整个解法的核心。
n的每一位为 1,代表x和y在该位不同whilen>0{n&=(n-1)count+=1}这段代码的作用是:
n中最右边的一个 1 变成 0这比“循环 32 次逐位判断”要高效得多,尤其在 1 很少的情况下。
letsolution=Solution()print(solution.hammingDistance(1,4))// 2print(solution.hammingDistance(3,1))// 1print(solution.hammingDistance(0,0))// 0print(solution.hammingDistance(7,10))// 3输出结果:
2 1 0 3完全符合预期。
汉明距离在工程里其实非常常见,只是你可能没注意到名字而已。
几个典型场景:
特征相似度计算
网络通信
版本对比
安全领域
这道题的解法,属于那种:
一旦你记住了,以后在代码里会经常用到。
O(k)其中k是x ^ y中 1 的个数。
最坏情况下(全是 1),也只是 32 次循环。
O(1)只用了几个整型变量,没有任何额外数据结构。
汉明距离这道题,非常适合作为: