Leetcode191. 位1的个数

本文详细解析了LeetCode第191题“位1的个数”的两种解题方法,包括直接遍历每一位检查和通过数字与其减一后的值进行与运算来计数的方法。提供了清晰的Scala代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Leetcode191. 位1的个数

题目:
编写一个函数,输入是一个无符号整数,返回其二进制表达式中数字位数为 ‘1’ 的个数(也被称为汉明重量)。
输入:11111111111111111111111111111101
输出:31
解释:输入的二进制串 11111111111111111111111111111101 中,共有 31 位为 ‘1’。

题解:
方法一:
简单粗暴些,依次判断最低位是否是 1,然后把它加入到结果中。判断最低位是否是 1,我们只需要把原数字和 000000…001 相与,也就是和 1 相与即可。
scala代码如下:

def hammingWeight(n: Int): Int = {
    var count = 0
    for (i <- 0 until 32) {
      val tmp = n >> i
      val s = tmp & 1
      if (s == 1) {
        count = count + 1
      }
    }
    count
  }

方法二:
思路:我们只需要将该数字与其减一之后的值进行与运算,然后再次循环,直到为0,其循环的次数就是该数字中1的个数。原理就是n&n-1一定可以消去该数字最后一位的1,,大家可以这样理解,不管对于n中最后一个一的位置如何比如为…1000…(N个)假设1的后面有N个0,对于该数字减一而言就变成了…01111…(N个)后面的0全部就因为借位变成了1,此时将两个数字相与就会把最后一个1之后(包括1)全部变成了0.同理如此循环一定能将所有的1全部变成0,这样循环的次数就变成了消去1的次数,也就是1的个数。
scala代码如下:

def hammingWeight2(n: Int): Int = {
    var count = 0
    var n1 = n
    while (n1 != 0) {
      n1 = n1 & (n1 - 1)
      count = count + 1
    }
    count
  }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值