《剑指offer》第十五题:二进制中1的个数

Posted 源周率

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《剑指offer》第十五题:二进制中1的个数相关的知识,希望对你有一定的参考价值。

// 面试题15:二进制中1的个数
// 题目:请实现一个函数,输入一个整数,输出该数二进制表示中1的个数。例如
// 把9表示成二进制是1001,有2位是1。因此如果输入9,该函数输出2。

#include <cstdio>

int NumberOf1_Solution1(int n)
{
    //主要思路:逐位与运算
    int count = 0;
    unsigned int flag = 1;
    while (flag)
    {
        if (n & flag)
            ++count;

        flag = flag << 1;
    }
    return count;
}

int NumberOf1_Solution2(int n)
{
    //主要思路:n-1 & n 相当于去掉二进制最右边1
    int count = 0;

    while (n)
    {
        ++count;
        n = (n - 1) & n;
    }
    return count;
}

分析:思路2牛逼!

把一个整数减去1之后再和原来的整数做位与运算,得到的结果相当于把整数的二进制表示中最右边的1变成0。

 方法1:时间复杂度:O(n)

 

以上是关于《剑指offer》第十五题:二进制中1的个数的主要内容,如果未能解决你的问题,请参考以下文章

剑指offer第十一题:二进制中1的个数

《剑指offer》第五十五题II:平衡二叉树

剑指Offer(Java版)第三十五题:给一个数组,返回它的最大连续子序列的和

剑指offer-第十题方法总结

剑指Offer(Java版)第四十五题:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。

剑指Offer(Java版)第六十五题:给定一棵二叉搜索树,请找出其中的第k小的结点。 例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。