摘要:图解第二种算法图解代码示例算法如果为真,说明拿到的是二进制序列的个数为算法为的时候说明已经拿完了,循环终止二进制序列中的个数以上代码,还可做优化在此仅作参考,若有更好的算法,还望能够私信告知,多谢各位。
算法是一个程序员的内功,能很好的体现程序员的编程思维,通过学习和掌握常见的算法,不仅能提高coding能力,还能更加容易在笔面试中脱颖而出。本专栏将记录博主刷算法题的过程,不定期的会更新一些优质的算法题。如果对大家有帮助,别忘了三连支持哟!
目录
?:
牛客网题目链接:二进制中1的个数
?:这题在我们分析后会发现题目的难点在于,我们要如何在二进制补码序列中找到1并记录1的个数。在这里我提供两种算法来解决这个难点。
? 1:我们知道一个数按位与上1得到的结果是除最低位外其它位全部变成0,那么我们可以说一个数按位与上1得到的结果是最后1位,那么我们可以通过按位与操作与右移操作,将二进制序列的每一位都拿下来再判断是不是1即可解决问题。
2:我们知道二进制序列肯定会存在最后一个1,那么如果我让这个数减一,原来的最后一个1的位置上会变成0,而原本在这最后一个1后面为0的位置上会出现1,那么如果我让这个数按位与本身减一就会把最低位的1去掉,每一次进行这样的操作就会少一个1,同样的也能够计算出1的个数。
?:图解
#includeint main(){ int n = 0; scanf("%d", &n); int i = 0; int count = 0; while (i < 32) { if ((n >> i) & 1)//如果为真,说明拿到的是1 { count++; } i++; } printf("二进制序列1的个数为:%d", count); return 0;}
#includeint main(){ int n = 0; scanf("%d", &n); int count = 0; while (n)//n为0的时候说明1已经拿完了,循环终止 { n &= (n - 1); count++; } printf("二进制序列中1的个数:%d", count); return 0;}
以上代码,还可做优化在此仅作参考,若有更好的算法,还望能够私信告知,多谢各位。
由于本人水平十分有限,若有错误请即使告知!如果有帮助别忘了,万分感谢。
点赞? 收藏✨ 关注✌
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/118806.html
摘要:问题描述输入一个整数,输出该数二进制表示中的个数。其中负数用补码表示。思路方法将二进制变成字符数组,遍历数组统计的个数,这种办法不需要考虑正负数。遍历字符数组,统计的个数判断该位是否是,如果是就,否则执行下一次循环。的二进制表示想右移一位。 1.问题描述 输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。 2.思路 方法1:将二进制变成字符数组,遍历数组统计1的个数,这...
摘要:题目输入一个整数,输出该数二进制表示中的个数。其中负数用补码表示。二进制与运算符符号为,表示若两个二进制位都为,则结果为,否则为。所以用于比较的这个数字初始值为,比较完后让左移位,这样就可以依次比较所有位是否为。 题目 输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。 分析 这是一道考察二进制的题目 二进制或运算符(or):符号为|,表示若两个二进制位都为0,则结果为0...
摘要:剑指系列刷题第一篇题目来源数组中数字出现的次数大家可以去测试一下自己的代码博主码云链接文章目录前言题目描述解题思路解题代码前言这是剑指系列刷题第一篇文章,大家可以互相学习一下。其中的两个单身狗是和。 ...
摘要:导航小助手剑指从尾到头打印链表题目详情解题思路源代码总结剑指从尾到头打印链表题目详情输入一个链表的头节点,从尾到头反过来返回每个节点的值用数组返回。时间复杂度方法先反转链表并求长度,在将反转后的链表数据拷贝至数组中。 ...
阅读 1670·2021-11-19 09:40
阅读 2928·2021-09-24 10:27
阅读 3218·2021-09-02 15:15
阅读 1879·2019-08-30 15:54
阅读 1204·2019-08-30 15:54
阅读 1371·2019-08-30 13:12
阅读 629·2019-08-28 18:05
阅读 2794·2019-08-27 10:53