博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
剑指 Offer 15. 二进制中1的个数
阅读量:4101 次
发布时间:2019-05-25

本文共 1280 字,大约阅读时间需要 4 分钟。

题目

请实现一个函数,输入一个整数(以二进制串形式),输出该数二进制表示中 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++

转载地址:http://enwsi.baihongyu.com/

你可能感兴趣的文章
ORACLE模糊查询优化浅谈
查看>>
关于ORACLE查询列加()or () 报ORA-00923:未找找到要求的FROM关键字
查看>>
zgrep 与 grep 区别
查看>>
sftp文件传输
查看>>
论计算机基础的重要性
查看>>
Velocity indxeOf() 过滤非法字符
查看>>
Outlook 中间区域无法显示邮件内容解决方法
查看>>
2015——致我那终将逝去的青春
查看>>
2016——个人年度总结
查看>>
2017——新的开始,加油!
查看>>
【设计模式】—-(3)抽象工厂模式(创建型)
查看>>
【关于选择】—-(1)放下努力和坚持吧
查看>>
【设计模式】—-(抽象工厂模式和工厂方法模式区别)
查看>>
【设计模式】—-(4)建造者模式(创建型)
查看>>
【设计模式】—-(5)原型模式(创建型)
查看>>
【设计模式小结】—-创建型模式
查看>>
【设计模式】—-(6)适配器模式(结构型)
查看>>
【设计模式】—-(7)桥接模式(结构型)
查看>>
【设计模式】—-(8)装饰模式(结构型)
查看>>
【设计模式】—-(9)组合模式(结构型)
查看>>