2

LeetCode-191.位1的个数(java)

 1 year ago
source link: https://blog.51cto.com/u_15700751/5580664
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

一、前言🔥

👨‍🎓作者:bug菌

✏️博客:​ ​CSDN​​​、​ ​掘金​​等

💌公众号:​ ​猿圈奇妙屋​

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

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

 ​《每日一题LeetCode》​​给重新捯饬起来,只为帮助小伙伴们,能顺利上岸,收到自己心仪的offer,面试第一关, 就是算法题。因为我始终坚信,变强绝对不是一朝一夕,而是贵在长久坚持,持之以恒。所以,赶紧跟着bug菌的步伐卷起来吧⏰,变强从这一刻开始➕🧈。

       小伙伴们在批阅文章的过程中如果觉得文章对您有一丝丝帮助,还请别吝啬您手里的赞呀,大胆的把文章点亮👍吧,您的点赞三连(收藏⭐️+关注👨‍🎓+留言📃)就是对bug菌我创作道路上最好的鼓励与支持😘。时光不弃🏃🏻‍♀️,创作不停💕,加油☘️

二、题目描述🔥

题目:

        编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 '1' 的个数(也被称为汉明重量)。

提示:

        请注意,在某些语言(如 Java)中,没有无符号整数类型。在这种情况下,输入和输出都将被指定为有符号整数类型,并且不应影响您的实现,因为无论整数是有符号的还是无符号的,其内部的二进制表示形式都是相同的。
        在 Java 中,编译器使用二进制补码记法来表示有符号整数。因此,在上面的示例 3 中,输入表示有符号整数 -3。

具体请看如下示例:

示例 1:

输入:00000000000000000000000000001011
输出:3
解释:输入的二进制串 00000000000000000000000000001011 中,共有三位为 '1'。

示例 2:

输入:00000000000000000000000010000000
输出:1
解释:输入的二进制串 00000000000000000000000010000000 中,共有一位为 '1'。

示例 3:

输入:11111111111111111111111111111101
输出:31
解释:输入的二进制串 11111111111111111111111111111101 中,共有 31 位为 '1'。

提示:

  • 输入必须是长度为​​32​​ 的二进制串

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

三、思路分析🔥

        刚刷到这道题的时候,我在想,这一看又是一道二进制题,该不会也跟上一期190.颠倒二进制法一道题型吧?我抱着怀疑的慢慢读题看示例,果不其然,还真是,只不过这道题是要你进行 为'1' 的进行个数统计。很简单吧?

        当然简单啦。我直接思如涌泉,最惯用的伎俩之暴力法,所以我们就先来尝试下暴力解题吧

思路1:暴力法

        我们只需要判断是为1的进行次数加1,所以我们直接可以这么干,先把这串值转成一个string字符串,然后对字符串进行逐一遍历,对此比较每一位,只需要是1,就将count+1.否则直接跳过接着下一次循环。非常之牛皮。

思路2:位运算法

        其实啊,真正这道题还是考察我们的位运算基础,题目要求就是将所有为1的次数统计出来,

我们可以直接循环挨个判断给定整数 n 的二进制位的每一位是否为 1,为1就将count+1。而该思路的具体做法为:当检查第 i 位时,我们可以让 i 与 1 进行与(&)运算,当且仅当 n 的第 i 位为 1 时,运算结果不为 0,则自然count+1,否则count+0。比如对于&运算,相同位数都是1,则该位结果是1,否则是0。

比如1&0 =0;1&1 =1;0&0 =0;

四、算法实现🔥

暴力法-AC代码

具体算法代码实现如下:

public class Solution {
public int hammingWeight(int {
//用于将十进制转成二进制输出。
String str = Integer.toBinaryString(n);
//用于统计
int count = 0;
for (int i = 0; i < str.length(); i++) {
//匹配为1的字符串。
if (str.charAt(i) == '1')
count++;
}
return

暴力法-AC代码

具体算法代码实现如下:

public class Solution {
public int hammingWeight(int {

//用于1次数统计
int count = 0;
for (int i = 0; i < 32; i++) {
count += ((n >> i) & 1);
}
return

五、总结🔥

暴力法-leetcode提交运行结果截图如下:

LeetCode-191.位1的个数(java)_暴力法_02

复杂度分析:

  • 时间复杂度:O(k)。由k定,因为需要检查n的二进制位的每一位,k=32,一共要检查32位。
  • 空间复杂度:O(1)。因为我们只需要常数的空间保存若干变量,即为O(1)。

位运算法-leetcode提交运行结果截图如下:

LeetCode-191.位1的个数(java)_位运算_03

 复杂度分析:

  • 时间复杂度:O(k)。由k定,因为需要检查n的二进制位的每一位,k=32,一共要检查32位。
  • 空间复杂度:O(1)。因为我们只需要常数的空间保存若干变量,即为O(1)。

           总而言之:你们可以对比下这两种解决思路,明显是执行用时上,方法2高效,在内存消耗上,二者皆为一致。

        反过来说,这道题主要的还是考察我们的位运算基础,如果对位运算的运算逻辑不是很清楚的同学,建议好好去恶补一下,要不然在日后的面试中遇到这种位运算题岂不是吃了大亏,毕竟不难啊,如果巧用位运算解题,也能在解题计较中拔得头筹,毕竟暴力法不是长久之计,虽然可以暴力,但是如果最求高效且内耗短,那就尽量在平日的刷题中,多积累解题模型。

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

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

六、热门推荐🔥


七、文末🔥

 ​《每日一题LeetCode》​​,带着你一块儿刷题,专栏每一篇都附带详细解法,手把手带你解题。

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

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

最后送大家两句话,与诸君共勉!


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

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


LeetCode-191.位1的个数(java)_暴力法_05

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

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

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

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

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK