Leetcode191--位1的个数(含多种解法和图解分析)

博客围绕Leetcode191位1的个数展开,介绍题目为编写函数计算无符号整数二进制中1的个数。给出多种解题思路,包括右移数字统计、设置flag左移统计,还提及剑指offer的解法及Python一行代码解题,同时探讨了右移可能陷入死循环的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Leetcode191–位1的个数

编写一个函数,输入是一个无符号整数,返回其二进制表达式中数字位数为 ‘1’ 的个数(也被称为汉明重量)。

作者:黑暗主宰

邮箱:shengzhanhe@gmail.com

Leetcode191–位1的个数

题目描述

原题链接:

​ https://leetcode-cn.com/problems/number-of-1-bits/ (中文)

​ https://leetcode.com/problems/number-of-1-bits/ (英文)

题目描述:

​ 编写一个函数,输入是一个无符号整数,返回其二进制表达式中数字位数为 ‘1’ 的个数(也被称为汉明重量

示例 1:
  输入:00000000000000000000000000001011
  输出: 3
  解释: 输入的二进制串 00000000000000000000000000001011 中,共有三位为 ‘1’。
示例 2:
  输入:00000000000000000000000010000000
  输出: 1
  解释: 00000000000000000000000010000000 中,共有一位为 ‘1’。
示例 3:
  输入:11111111111111111111111111111101
  输出: 31
  解释:输入的二进制串 11111111111111111111111111111101 中,共有 31 位为 ‘1’。

解题思路

这道题是一个位运算操作的题,最简答的思路就是不断的把数字右移,如果非零,累计数量加1,直到数字移位等于0,循环结束。

def hammingWeight(n):
	count = 0
	while n:
		if n & 1 == 1:
			count += 1
		n = n >> 1
	return count

剑指offer上说这样解可能陷入死循环,但是leetcode提交后也AC了(XD)。那剑指offer上的例子来说,就是加入输入的是 0x80000000 ,右移移位的话,不是得到 0x40000000 而是得到 0xC0000000 ,所以一直右移的话,会得到 0xFFFFFFFF,陷入死循环。(leetcode中为什么这样写可以AC呢,估计是因为python语言的特性吧)

然后,假如右移会存在进入死循环的可能,怎么避免呢,可以逆向思维,设置一个flag,初始值为1,每次把flag向左移一次,最大的数是32位,所以移动32次,就可以统计出来1的个数

def hammingWeight(n):
	count = 0
	flag = 1
	for i in range(32):
		if n & flag:
			count += 1
		flag = flag << 1
	return count

另外就是剑指offer上提供的一种比较巧的解法,就是说我们假如一个数字的有m个1,我们每次把从第一个1开始反转,直到第m个,这样要求解的整数n就变成了零,具体的,我们画个图说明一下,
在这里插入图片描述

代码如下

def hammingWeight(n):
	cnt = 0
	while n:
		cnt += 1
		n &= (n-1)
	return cnt

最后,再来一个python独有的骚操作,一行代码解题

def hammingWeight(n):
	return str(bin(n)).count('1')

欢迎大家关注我的个人公众号,同样的也是和该博客账号一样,专注分享技术问题,我们一起学习进步
在这里插入图片描述

注: 文中有写错的地方,欢迎大家不吝指正!!!

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值