剑指 Offer 15. 二进制中1的个数

题目

请实现一个函数,输入一个整数(以二进制串形式),输出该数二进制表示中 1 的个数。例如,把 9 表示成二进制是 1001,有 2 位是 1。因此,如果输入 9,则该函数输出 2。

示例1

输入:00000000000000000000000000001011
输出:3
解释:输入的二进制串 00000000000000000000000000001011 中,共有三位为 ‘1’。

示例2

输入:00000000000000000000000010000000
输出:1
解释:输入的二进制串 00000000000000000000000010000000 中,共有一位为 ‘1’。

这里需要补充的是,它这里是输入一个数字,然后需要自己脑补它二进制的样子,然后再统计这二进制时有多少个1。所以这里不能直接遍历二进制数位,需要借助一些运算规则来转换统计。这里是使用了与运算来做是作为符合二进制这个场景。
我们知道与运算的规则是只有同时为1才输出1,那么统计就要遍历,我们知道二进制和十进制的交汇点是0,所以可以设置遍历出口是当与运算的结果为0时,就停止统计,那么就要想需要怎样推动遍历呢,对于二进制来说,就是左移右移运算了,此处,右移1位相当于十进制里面的n+=1,在实际使用上就是二进制右移动,相当于十进制除以2,那么通过右移动来遍历不为0 的数字。
常识需记住:

若 n & 1 = 0 ,则 n 二进制 最右一位 为 0 ;
若 n & 1 = 1,则 n 二进制 最右一位 为 1。

那么第一种方法逐位判断

class Solution(object):
	def hammingWeight(self,n):
		res=0
		while(n):
			res+=n&1
			n>>=1
		return res

第二种方法,提出的那个博主是真的有才,太强了
他利用十进制的形式上的递减,加速遍历效率

class Solution(object):
	def hammingWeight(self,n):
		res=0
		while(n):
			res++
			n&=n-1
		return res

第二种方法的输入过程
输入是整数—》脑补成二进制—》统计二进制形式下1的个数
与运算
同为1才为1,其余都为0
所以这里为了不超时,把原本右移运算换成0,1 切换
输入是11===》
00000000000000000000000000001011
然后n-1是==》10
00000000000000000000000000001010
然后n&n-1==>10 res++
00000000000000000000000000001010
然后n-1==>9
00000000000000000000000000001001
然后n&n-1==>8 res++
00000000000000000000000000001000
然后n-1==>7
00000000000000000000000000000111
然后n&n-1==>0 res++

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值