资讯专栏INFORMATION COLUMN

剑指offer:二进制中1的个数(Java)

lifesimple / 1369人阅读

摘要:问题描述输入一个整数,输出该数二进制表示中的个数。其中负数用补码表示。思路方法将二进制变成字符数组,遍历数组统计的个数,这种办法不需要考虑正负数。遍历字符数组,统计的个数判断该位是否是,如果是就,否则执行下一次循环。的二进制表示想右移一位。

1.问题描述

输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。

2.思路

方法1:将二进制变成字符数组,遍历数组统计1的个数,这种办法不需要考虑正负数。

 1 public class Solution {
 2   public int NumberOf1(int n) {
 3     String s = Integer.toBinaryString(n);//将n变成二进制之后变成字符串
 4     char[] num = s.toCharArray();//将字符串变成字符数组
 5     int count = 0;//定义一个变量,用来计数,统计1的个数。
 6     for(int i = 0; i < num.length; i++){//遍历字符数组,统计1的个数
 7       if(num[i] == "1"){//判断该位是否是1,如果是1,count就++,否则执行下一次循环。
 8         count++;
 9       }
10     }
11     return count;//返回1的个数。
12   }
13 }

方法2:一种很巧妙的办法——n&(n-1)

解释一下:n-1之后,就把二进制表示种的从右开始的第一个1变成了0,同时把第一个1右边的0变成了1.例如1100,减1之后就是1011,再和1100(也就是n)进行&运算结果就是1000,然后将结果赋值给n,把最右边的1变成了0,这样循环,直到n变成0停止,循环过程统计1出现的次数即可。

 1 public class Solution {
 2   public int NumberOf1(int n) {
 3     int count = 0;//定义计数器变量
 4     while(n != 0){//n不等于0就循环
 5       count++;//n不为0,那么n的二进制表示中就必有1,所以count++.
 6       n = n&(n-1);//这个过程就是把n的二进制表示的最右边的1变成0,其他位不变,然后再赋值给n。
 7     }
 8     return count;//返回计数器的的结果。
 9   }
10 }

方法3:无符号右移

思路就是把整数n变成二进制表示后逐个判断最低位是否是1,如果是1就让计数器加1,然后进行无符号右移1位,如果不是1,就直接右移1位,直到传入的整数n变成0停止。
(因为无符号位移不管最高位是0还是1,右移之后都用0补齐,所以不需要考虑正负数的问题)

 1 public class Solution {
 2   public int NumberOf1(int n) {
 3     int count = 0;//计数器
 4     while(n!=0){//n不为0才执行循环
 5       count+=n&1;//这里很巧妙,n&1,用来判断最后以为是不是1,如果是1,执行前面count+=1;如果不是1,那么n&1的结果就是0,count就不变。
 6     n = n>>>1;//n的二进制表示想右移一位。
 7     }
 8     return count;//返回结果。
 9   }
10 }

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/75422.html

相关文章

  • 剑指offer】一个数进制序列1个数

    摘要:图解第二种算法图解代码示例算法如果为真,说明拿到的是二进制序列的个数为算法为的时候说明已经拿完了,循环终止二进制序列中的个数以上代码,还可做优化在此仅作参考,若有更好的算法,还望能够私信告知,多谢各位。 ✨前言✨: 算法是一个程序员的内功,能很好的体现程序员的编程思维,通过学习和掌握常见的算...

    weknow619 评论0 收藏0
  • 剑指offer】9.进制1个数

    摘要:题目输入一个整数,输出该数二进制表示中的个数。其中负数用补码表示。二进制与运算符符号为,表示若两个二进制位都为,则结果为,否则为。所以用于比较的这个数字初始值为,比较完后让左移位,这样就可以依次比较所有位是否为。 题目 输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。 分析 这是一道考察二进制的题目 二进制或运算符(or):符号为|,表示若两个二进制位都为0,则结果为0...

    scq000 评论0 收藏0
  • 剑指offer系列刷题】第一篇——寻找单身狗

    摘要:剑指系列刷题第一篇题目来源数组中数字出现的次数大家可以去测试一下自己的代码博主码云链接文章目录前言题目描述解题思路解题代码前言这是剑指系列刷题第一篇文章,大家可以互相学习一下。其中的两个单身狗是和。 ...

    xavier 评论0 收藏0
  • 剑指offer系列——剑指 Offer 06. 从尾到头打印链表(C语言)

    摘要:导航小助手剑指从尾到头打印链表题目详情解题思路源代码总结剑指从尾到头打印链表题目详情输入一个链表的头节点,从尾到头反过来返回每个节点的值用数组返回。时间复杂度方法先反转链表并求长度,在将反转后的链表数据拷贝至数组中。 ...

    DevTTL 评论0 收藏0
  • 剑指offer系列——剑指 Offer 22. 链表倒数第k个节点(C语言)

    摘要:导航小助手剑指链表中倒数第个节点题目详情解题思路源代码总结剑指链表中倒数第个节点题目详情输入一个链表,输出该链表中倒数第个节点。为了符合大多数人的习惯,本题从开始计数,即链表的尾节点是倒数第个节点。这个链表的倒数第个节点是值为的节点。 ...

    voidking 评论0 收藏0

发表评论

0条评论

lifesimple

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<