本文共 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/