LeetCode-461. 汉明距离 (day41)

135 阅读6分钟

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

👨‍🎓作者:bug菌

✏️博客:CSDN掘金

💌公众号:猿圈奇妙屋

🚫特别声明:原创不易,转载请附上原文出处链接和本文声明,谢谢配合。

🙏版权声明:文章里可能部分文字或者图片来源于互联网或者百度百科,如有侵权请联系bug菌处理。

一、前言🔥

       哈喽,小伙伴们,我是bug菌呀👀。由于上海这波疫情,导致很多小伙伴扛不住降薪打击而选择离开自己的上家,借此, 对于没有工作或者即将失业要重新面试的小伙伴而言,bug菌想接着把上几个月更新的专栏《LeetCode每日一题》给重新捯饬起来,只为帮助小伙伴们,能顺利上岸,收到自己心仪的offer,面试第一关, 就是算法题。因为我始终坚信,变强绝对不是一朝一夕,而是贵在长久坚持,持之以恒。所以,赶紧跟着bug菌的步伐卷起来吧⏰,变强从这一刻开始➕🧈。

二、题目描述🔥​

题目:

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

给你两个整数 xy,计算并返回它们之间的汉明距离。

具体请看如下示例:

示例 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即可。

思路1-内置位计数法

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

思路2-位运算法

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

四、算法实现🔥

AC代码-内置位计数法

具体算法代码实现如下:

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

AC代码-位运算法

具体算法代码实现如下:

class Solution2 {
    public int hammingDistance(int x, int y) {
        int s = x ^ y, ret = 0;
        while (s != 0) {
            ret += s & 1;
            s >>= 1;
        }
        return ret;
    }
}

五、总结🔥

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

复杂度分析:

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

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

复杂度分析:

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

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

... ...

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

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

六、往期推荐🔥

七、文末🔥

       如果你还想要学习更多,小伙伴们大可关注bug菌专门为大家创建的专栏《LeetCode每日一题》!带着你一块儿刷题,专栏每一篇都附带详细解法,手把手带你解题。

       一个人刷可能会觉得很累很难坚持,但是一群人刷就会觉得它是一件很有意义的事儿,互相督促互相鼓励,一起变强。

       我是bug菌,一名想走👣出大山改变命运的程序猿。接下来的路还很长,都等待着我们去突破、去挑战。来吧,小伙伴们,我们一起加油!未来皆可期,fighting!

最后送大家两句我很喜欢的话,与诸君共勉!

**************************************************

☘️做你想做的人,没有时间限制,只要愿意,什么时候都可以start,

🍀你能从现在开始改变,也可以一成不变,这件事,没有规矩可言,你可以活出最精彩的自己。

**************************************************

💌如果文章对您有所帮助,就请留下您的吧!(#^.^#);

💝如果喜欢bug菌分享的文章,就请给bug菌点个关注吧!(๑′ᴗ‵๑)づ╭❤~;

💗如果对文章有任何疑问,还请文末留言或者加群吧【QQ交流群:708072830】;

💞鉴于个人经验有限,所有观点及技术研点,如有异议,请直接回复参与讨论(请勿发表攻击言论,谢谢);

💕版权声明:原创不易,转载请附上原文出处链接和本文声明,版权所有,盗版必究!!!谢谢。