当前位置: 首页 > news >正文

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

题记:

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

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

题目来源:
作者:LeetCode
链接:https://leetcode.cn/leetbook/read/top-interview-questions-easy/xnyode/
来源:力扣(LeetCode)

解题方法:

x和y都转化为二进制的时候,在相同的位置上如果值都一样,他们的汉明距离就是0。如果在相同的位置上值不一样,有多少个不一样的位置,那么汉明距离就是多少。所以看到这道题,我们应该最容易想到的就是先异或运算,然后再计算这个异或运算的结果在二进制表示中1的个数。代码如下

public int hammingDistance(int x, int y) {return Integer.bitCount(x ^ y);
}

一行代码搞定,这题实际上没什么难度,我们只需要计算x和y的异或结果,然后再计算这个结果的二进制中1的个数即可。在之前我们分3个系列分别讲到了二进制中1的个数

《位1的个数系列(一)》
《位1的个数系列(二)》
《位1的个数系列(三)》

当然这题答案非常多,下面我们再来看两种写法

一:右移

public int hammingDistance(int x, int y) {int xor = x ^ y;int res = 0;while (xor != 0) {res += xor & 1;xor = xor >>> 1;}return res;
}

转换为PHP代码为:

function hammingDistance($x, $y) {$xor = $x ^ $y;$count = 0;while($xor != 0){$count += $xor & 1;$xor = $xor >> 1;}return $count;
}

二:不通过移位计算

前面两种方式要么是移动原数字,要么是移动1,这次我们不移动任何数字来计算。在位运算中有这样一个操作,就是n&(n-1)可以把n最右边的1给消掉。举个例子,当n=12的时候,我们来画个图看一下
在这里插入图片描述
明白了这个知识点,代码就很容易写了,我们通过循环计算,不断的把n右边的1给一个个消掉,直到n等于0为止

public int bitCount(int n) {int count = 0;while (n != 0) {n &= n - 1;count++;}return count;
}

我们还可以把它给为递归的写法,直接一行代码搞定

public int bitCount(int n) {return n == 0 ? 0 : 1 + bitCount(n & (n - 1));
}

转换为PHP代码为:

function hammingDistance($x, $y) {$xor = $x ^ $y;$count = 0;while($xor != 0){$count += 1;$xor &= $xor - 1;}return $count;
}

方法来源:
作者:数据结构和算法
链接:https://leetcode.cn/leetbook/read/top-interview-questions-easy/xnyode/?discussion=TsikCY
来源:力扣(LeetCode)

http://www.lryc.cn/news/107245.html

相关文章:

  • Android 之 使用 Camera 拍照
  • 盘点7月Sui生态发展,了解Sui的近期成长历程!
  • 6.物联网操作系统信号量
  • 《向量数据库指南》——使用Milvus Cloud操作员安装Milvus Cloud独立版
  • Redis的基础知识
  • Sorting Layer与Order in Layer
  • 动手学深度学习—卷积神经网络(原理解释+代码详解)
  • 环球数科、BUFFALO面试(部分)
  • RabbitMQ快速入门
  • 使用Git在GitHub上部署静态页面
  • SQL-每日一题【1084. 销售分析III】
  • Redis 软件包,在 CentOS 7 中安装 Redis
  • 01.Redis实现发送验证码保存功能
  • C++STL——deque容器详解
  • docker 哨兵模式和集群模式安装Redis7.0.12
  • go nil 与零值
  • puppeteer监听response并封装为express服务调用
  • kubernetes之Ingress
  • 前端实现打印1 - 使用 iframe 实现 并 分页打印
  • MIAOYUN获评“2023年度一云多芯稳定安全运行优秀案例”
  • 论文代码学习—HiFi-GAN(4)——模型训练函数train文件具体解析
  • 安防视频综合管理合平台EasyCVR可支持的视频播放协议有哪些?
  • 一张表格讲明白white-space属性。html如何识别\n\r,让这些特殊换行符换行。
  • 【Linux】编写shell脚本将项目前一天打印的日志进行提取,并且单独保存
  • 快速搭建单机RocketMQ服务(开发环境)
  • Centos7搭建Apache Storm 集群运行环境
  • C语言假期作业 DAY 12
  • 2.4在运行时选择线程数量
  • element-ui中Notification 通知自定义样式、按钮及点击事件
  • 无头单向非循环单链表、带头双向循环链表