剑指 Offer(第2版)面试题 15:二进制中1的个数

剑指 Offer(第2版)面试题 15:二进制中1的个数

  • [剑指 Offer(第2版)面试题 15:二进制中1的个数](#剑指 Offer(第2版)面试题 15:二进制中1的个数)

剑指 Offer(第2版)面试题 15:二进制中1的个数

题目来源:26. 二进制中1的个数

此题与 Leetcode191. 位1的个数 一致。

解法1:位运算

循环检查给定整数 n 的二进制位的每一位是否为 1。

当检查第 i 位时,我们可以让 n 与 2^i^ 进行与(&)运算,当且仅当 n 的第 i 位为 1 时,运算结果不为 0。

设置一个计数器,遍历一次即可得到位 1 的个数。

注意:1 << i 必须是 uint32_t 的。

代码:

c 复制代码
class Solution
{
public:
	int NumberOf1(int n)
	{
		int count = 0;
		for (int i = 0; i < 32; i++)
			if (n & (uint32_t)1 << i)
				count++;
		return count;
	}
};

复杂度分析:

时间复杂度:O(k),其中 k = 32,是 int 的位数。

空间复杂度:O(1)。

解法2:n & (n - 1)

随便一个 n:

那么 n - 1 会发生什么:对于上面随便给的一个 n,减去 1,但是低 2 位都是 0,减 1 必然需要借位,那何时结束呢?答案就是遇到 1 的时候。如果第一步骤中给的 n 末尾为 1,那么就直接在低位就结束了,也符合遇到 1 就停止的规则。

总结而言,n - 1 操作:

  1. 无论是借位,还是减 1,遇到 1 就停止;

  2. 从低位到高位,一直到 1,每一位都发生了反转。

n & (n - 1):将 n 最低位的一个 1 变成 0。

于是,要求一个数 n 中二进制 1 的个数,我们可以不断地对 n 进行 n = n & (n - 1) 操作,每进行一次,n 中最低位的 1 就会变成 0,直到 n 变成 0 为止,操作次数就是 n 中二进制 1 的个数。

代码:

c 复制代码
class Solution
{
public:
	int NumberOf1(int n)
	{
		int count = 0;
		while (n)
		{
			n = n & (n - 1);
			count++;
		}
		return count;
	}
};

复杂度分析:

时间复杂度:O(log n)。

空间复杂度:O(1)。

相关题目

LeetCode 231. 2 的幂

相关推荐
理论最高的吻13 分钟前
98. 验证二叉搜索树【 力扣(LeetCode) 】
数据结构·c++·算法·leetcode·职场和发展·二叉树·c
沈小农学编程18 分钟前
【LeetCode面试150】——202快乐数
c++·python·算法·leetcode·面试·职场和发展
ZZZ_O^O31 分钟前
【动态规划-卡特兰数——96.不同的二叉搜索树】
c++·学习·算法·leetcode·动态规划
机器视觉知识推荐、就业指导1 小时前
C++设计模式:原型模式(Prototype)
c++·设计模式·原型模式
清酒伴风(面试准备中......)1 小时前
操作系统基础——针对实习面试
笔记·面试·职场和发展·操作系统·实习
GDDGHS_1 小时前
“Kafka面试攻略:核心问题与高效回答”
分布式·面试·kafka
feiyangqingyun1 小时前
Qt/C++离线地图的加载和交互/可以离线使用/百度和天地图离线/支持手机上运行
c++·qt·qt天地图·qt离线地图·qt地图导航
MinBadGuy2 小时前
【GeekBand】C++设计模式笔记13_Flyweight_享元模式
c++·设计模式
一子二木生三火2 小时前
IO流(C++)
c语言·开发语言·数据结构·c++·青少年编程
谁在夜里看海.2 小时前
【从零开始的算法学习日记✨优选算法篇✨】第二章:流动之窗,探索算法的优雅之道
c++·学习·算法