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