题目
题目描述
请实现一个函数,输入一个整数,输出该数二进制表示中 1 的个数。例如,把 9 表示成二进制是 1001,有 2 位是 1。因此,如果输入 9,则该函数输出 2。
示例1
输入:11
输出:3
解释:输入11的二进制串00000000000000000000000000001011
中,共有三位为 ‘1’。
示例2
输入:256
输出:1
解释:输入256的二进制串00000000000000000000000010000000
中,共有一位为 ‘1’。
题解
逐位右移
输入数字n的二进制与1作 与运算&,判断二进制最右位是否为1,然后将n 循环右移。
- n&1 == 1:数字n的二进制最右位为1;
- n&1 == 0:数字n的二进制最右位为0。
1)判断最右位是否为1,并将结果计数; 2)将n右移一位; 3)循环结束后返回计数器值。
[例]:11的二进制为0x1011,1)n&1==1; 2)n>>1==5(0x0101); 循环。
时间复杂度:O(logn),数字n的二进制共有logn位,故需循环logn次;
空间复杂度:O(1)
class Solution: |
n & (n-1)
n&(n-1) 将最右一位1消去 变为0,计数并循环直到 消去所有1。
- n-1:把数字n的二进制中最右边的1变为0,并将其右边的0全变为1。[例]:10的二进制为0x1010,n-1为0x1001。
- n&(n-1):把数字n的二进制中最右边的1变为0,其余不变。[例]:10的二进制为0x1010,10&9==0x1000。
1)计数器加1; 2)消去最右一位1; 3)循环结束后返回计数器值。
[例]:10的二进制为0x1010,1)count+=1; 2)n=n&(n-1)==8(0x1000); 循环。
时间复杂度:O(m),只需消去所有1,m为二进制数所有1的个数;
空间复杂度:O(1)
class Solution: |
Python函数
bin(n: int)返回数字n的string类型的二进制值。[例]:bin(10)==0x1010。
1)将数字转为二进制; 2)统计1的个数。
时间复杂度:根据底层实现决定;
空间复杂度:O(1)
class Solution: |