《剑指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(Java版)第三十五题:给一个数组,返回它的最大连续子序列的和
剑指Offer(Java版)第四十五题:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
剑指Offer(Java版)第六十五题:给定一棵二叉搜索树,请找出其中的第k小的结点。 例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。