备战秋招60天算法挑战,Day21

题目链接: https://leetcode.cn/problems/number-of-1-bits/

视频题解: https://www.bilibili.com/video/BV1ir421M7XU/

LeetCode 191.位1的个数

题目描述

编写一个函数,输入是一个无符号整数 (以二进制串的形式),返回其二进制表达式中数字位数为 1 的个数(也被称为汉明重量)。

视频题解

位1的个数

思路来源

思路来源

思路解析

方法一

定义res保存1的个数。对于无符号整数n,统计其中1的个数步骤如下:

  1. 如果n != 0n对应二进制的最右边一位如果是1res++,进入步骤2。否则,返回res
  2. n对应的二进制向右移动一位,进入步骤1

关键在于如何获取n对应二进制的最右边一位和怎样n对应的二进制向右移一位

获取n对应二进制最右面一位有两种方式:

  1. n1进行与运算n & 1可以获取n对应二进制的最右面一位。
  2. n2取余n % 2即可获取n对应二进制的最右面一位。

n对应的二进制右移一位有两种方式:

  1. 直接使用编程语言自带的右移符号,比如c++可以写为n >> 1
  2. n / 2 也可以将n对应的二进制右移一位。

C++代码

class Solution {
public:
    int hammingWeight(uint32_t n) {
        int res = 0;
        while(n) {
           //获取n对应二进制最右边一位
           if (n % 2) {
               ++res;
           }
           //n对应的二进制右移一位
           n = n / 2;
        }
        return res;
    } 
};

java代码

class Solution {
    public int hammingWeight(int n) {
        int res = 0;
        while (n != 0) {
            // 获取n对应二进制最右边一位
            if (n % 2 == 1) {
                res++;
            }
            // n对应的二进制右移一位
            n = n / 2;
        }
        return res;
    }
}

python代码

class Solution:
    def hammingWeight(self, n: int) -> int:
        res = 0
        while n:
            # 获取n对应二进制最右边一位
            if n % 2:
                res += 1
            # n对应的二进制右移一位
            n = n // 2
        return res

方法二

定义res保存1的个数。对于无符号整数n,统计其中1的个数步骤如下:

  1. 如果n != 0res++,进入步骤2。否则,返回res
  2. n = n & (n - 1),进入步骤1

n & (n - 1)其实就是将n对应的二进制最右边值为1bit位置为0

在纸上继续按照上面步骤模拟一遍,会帮助大家更好的理解。

C++代码

class Solution {
public:
    int hammingWeight(uint32_t n) {
        int res = 0;
        while(n) {
            ++res;
            //n对应二进制最右边不为零的bit位置为零
            n = n&(n-1);
        }
        return res;
    } 
};

java代码

class Solution {
    public int hammingWeight(int n) {
        int res = 0;
        while (n != 0) {
            res++;
            // n对应二进制最右边不为零的bit位置为零
            n = n & (n - 1);
        }
        return res;
    }
}

python代码

class Solution:
    def hammingWeight(self, n: int) -> int:
        res = 0
        while n:
            res += 1
            # n对应二进制最右边不为零的bit位置为零
            n = n & (n - 1)
        return res

复杂度分析

时间复杂度: 两种方法都是O(1),因为二进制最长为32位。

空间复杂度: 两种方法都是O(1),只使用了几个整型变量。

  • 21
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值