前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >LeetCode-461. 汉明距离(java)

LeetCode-461. 汉明距离(java)

作者头像
bug菌
发布2023-05-27 15:06:45
1510
发布2023-05-27 15:06:45
举报

一、前言🔥

👨‍🎓作者:bug菌 ✏️博客:CSDN​、掘金等 💌公众号:​​猿圈奇妙屋​​ 🚫特别声明:原创不易,转载请附上原文出处链接和本文声明,谢谢配合。 🙏版权声明:文章里可能部分文字或者图片来源于互联网或者百度百科,如有侵权请联系bug菌处理。

二、题目描述🔥

题目:

        两个整数之间的指的是这两个数字对应二进制位不同的位置的数目。 给你两个整数 ​​x​​​ 和 ​​y​​,计算并返回它们之间的汉明距离。

具体请看如下示例:

示例 1:

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

示例 2:

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

提示:

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

题目来源:​​LeetCode原题地址​​ 题目难度:⭐⭐⭐

三、思路分析🔥

        一看到这题的第一印象,这出题人想必是个爱历史之人,都把历史背景给套上了,好一个明汉之距离,我越发的感兴趣,这题我今天必刷,哦吼,点进去,竟然不是啥历史背景,不就是求两数二进制位的互补次数么,有点小失落,不过这道题倒是能做一下。

        最近是掉二进制窝了么,连续做了好几天的二进制题,今天这题也与二进制紧紧相连,没办法,既然都点进来了,那就干脆给刷了吧。如下是我对这道题的一个解题思路。至于最暴力的方法我就不给大家普及了,就是将该二进制转成对于的String,Integer.toBinaryString()方法即可,然后分别对s1、s2进行同位判断,相异则count+1,最后返回count即可。我在代码AC处遍历对比法处出贴了该思路的代码,仅供参考,写法不是很优雅。

思路1-内置位计数法

        这种思路还是我看了官解才知道的,java竟然有提供这么个方法,在java.lang包中Integer类中有bitCount()方法,该方法作用就是以整数值的二进制补码表示形式返回one-bits的数量计数。这不就是完全符合该题么?它要的二进制位相异的就计数,哈哈哈,只能说太绝了。

思路2-位运算法

        传统做法,肯定就是依次对二进制位对比了。首先将x、y进行异或(^)操作,结果res中0的位表示x、y的这个二进制位置是相同的,1是位表示x、y的这个二进制位置不同。因此 计算 res 中为1的个数即可, 就将res每个位置与1 进行与(&)操作,记录个数即可。

四、算法实现🔥

AC代码-内置位计数法

具体算法代码实现如下:

代码语言:javascript
复制
class Solution1 {
    public int hammingDistance(int x, int {
        return

AC代码-位运算法

具体算法代码实现如下:

代码语言:javascript
复制
class Solution2 {
    public int hammingDistance(int x, int {
        int s = x ^ y, ret = 0;
        while (s != 0) {
            ret += s & 1;
            s >>= 1;
        }
        return

AC代码-遍历对比法

具体算法代码实现如下:

代码语言:javascript
复制
class Solution3 {
    public int hammingDistance(int x, int {
        int ans = 0;
        String s1 = Integer.toBinaryString(x);
        String s2 = Integer.toBinaryString(y);
        //补0
        if (s1.length() < s2.length()) {
            int l = s2.length() - s1.length();
            for (int i = 0; i < l; i++) {
                s1 = '0' + s1;
            }
        }
        if (s1.length() > s2.length()) {
            int l = s1.length() - s2.length();
            for (int i = 0; i <l; i++) {
                s2 = '0' + s2;
            }
        }
        for (int i = 0; i < s1.length(); i++) {
            if (s1.charAt(i) != s2.charAt(i)) {
                ans++;

            }
        }
        return

五、总结🔥

内置位计数法-leetcode提交运行结果截图如下:

LeetCode-461. 汉明距离(java)_位运算_03
LeetCode-461. 汉明距离(java)_位运算_03

复杂度分析:

  • 时间复杂度:logC)。C 是元素的数据范围。
  • 空间复杂度:O(1)。

内置位计数法-leetcode提交运行结果截图如下:

LeetCode-461. 汉明距离(java)_位运算_04
LeetCode-461. 汉明距离(java)_位运算_04

复杂度分析:

  • 时间复杂度:logC)。
  • 空间复杂度:O(1)。

       总而言之,对于这题,无非就是考察我们的位运算基础,核心就是对于​​ x^y,因为它可以对比获取​​​不同位置的结果,因为对于 位运算​​^​​​,当两对应的二进位相异时,结果为1,这也就是符合题意的统计结果,最后只需要将二进制进行异或(^)运算,其​​x^y = 1,次数+1,最后返回count即成功破题。​

        再者,解题道路千万条,欢迎小伙伴们脑洞大开,如果你们有啥更好的想法或者思路,欢迎评论区告诉我哦,大家一起互相借鉴互相学习,方能成长的更快。

       好啦,以上就是本期的所有内容啦,咱们下期见咯。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-08-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、前言🔥
  • 二、题目描述🔥
  • 三、思路分析🔥
  • 四、算法实现🔥
  • 五、总结🔥
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档