算法最优解 算法最优解
首页
目录
赞助
GitHub (opens new window)
首页
目录
赞助
GitHub (opens new window)
  • 数据结构基础

  • 数组

  • 位运算

    • 两整数之和
    • 位1的个数
      • 题目描述
      • 视频讲解
      • 思路解析
        • 方法一
        • C++代码
        • java代码
        • python代码
        • 方法二
        • C++代码
        • java代码
        • python代码
      • 复杂度分析
    • 比特位计数
    • 丢失的数字
    • 颠倒二进制位
  • 动态规划

  • 图

  • 区间

  • 链表

  • 矩阵

  • 字符串

  • 树

  • 堆

  • 逻辑思维

  • 目录
  • 位运算
华南溜达虎
2024-07-08
目录

位1的个数

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

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

# LeetCode 191.位1的个数

# 题目描述

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

# 视频讲解

建议大家点击视频跳转到b站位1的个数 (opens new window)观看,体验更佳!

# 思路解析

# 方法一

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

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

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

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

  1. n和1进行与运算n & 1可以获取n对应二进制的最右面一位。
  2. n对2取余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 != 0,res++,进入步骤2。否则,返回res。
  2. n = n & (n - 1),进入步骤1。

n & (n - 1)其实就是将n对应的二进制最右边值为1的bit位置为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),只使用了几个整型变量。

上次更新: 2024/07/28, 17:12:00
两整数之和
比特位计数

← 两整数之和 比特位计数→

Theme by Vdoing | Copyright © 2024-2024 华南溜达虎 | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式