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

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

题目


题目描述

请实现一个函数,输入一个整数,输出该数二进制表示中 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:
def hammingWeight(self, n: int) -> int:
count = 0
while n:
count += n & 1
n >>= 1
return count

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:
def hammingWeight(self, n: int) -> int:
count = 0
while n:
count += 1
n &= n - 1
return count

Python函数

bin(n: int)返回数字n的string类型的二进制值。[例]:bin(10)==0x1010。

1)将数字转为二进制; 2)统计1的个数。

时间复杂度:根据底层实现决定;
空间复杂度:O(1)

class Solution:
def hammingWeight(self, n: int) -> int:
return bin(n).count('1')

Comments

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×