如何设置二进制某一位的值_剑指Offer-15-二进制中1的个数

27158586a5b5cbba27bad0bb1a4a7bdb.png

题目

题目描述

请实现一个函数,输入一个整数,输出该数二进制表示中 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')
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值