数据研发笔试Leetcode刷题笔记14:二进制中1的个数

文章目录

  • 1 题目描述
  • 2 解题思路
    • 2.1 逐位判断
    • 2.2 巧用 n&(n−1)
  • 3 代码实现(Python3)
  • 4 复杂度分析

1 题目描述

来源:力扣(LeetCode)

请实现一个函数,输入一个整数,输出该数二进制表示中 1 的个数。例如,把 9 表示成二进制是 1001,有 2 位是 1。因此,如果输入 9,则该函数输出 2。
数据研发笔试Leetcode刷题笔记14:二进制中1的个数_第1张图片

2 解题思路

2.1 逐位判断

根据 与运算 定义,设二进制数字 n ,则有:

  • 若 n&1=0 ,则 n 二进制 最右一位 为 0 ;
  • 若 n&1=1 ,则 n 二进制 最右一位 为 1 。

根据以上特点,考虑以下 循环判断 :

  • 判断 n 最右一位是否为 1 ,根据结果计数。
  • 将 n 右移一位(本题要求把数字 n 看作无符号数,因此使用 无符号右移 操作)。

算法流程:

  • 初始化数量统计变量 res=0 。
  • 循环逐位判断: 当 n=0 时跳出。
  • res += n & 1 : 若 n&1=1 ,则统计数 res 加一。
  • n >>= 1 : 将二进制数字 n 无符号右移一位 。
  • 返回统计数量 res 。

2.2 巧用 n&(n−1)

(n−1) 解析: 二进制数字 n 最右边的 1 变成 0 ,此 1 右边的 0 都变成 1 。
n&(n−1) 解析: 二进制数字 n 最右边的 1 变成 0 ,其余不变。
数据研发笔试Leetcode刷题笔记14:二进制中1的个数_第2张图片

算法流程:

  • 初始化数量统计变量 res 。
  • 循环消去最右边的 1 :当 n=0 时跳出。
  • res += 1 : 统计变量加 1 ;
  • n &= n - 1 : 消去数字 n 最右边的 1 。
  • 返回统计数量 resres 。1

3 代码实现(Python3)

class Solution:
    def hammingWeight(self, n: int) -> int:
        法一 逐位判断
        res = 0
        while n:
            res += n & 1
            n >>= 1
        return res
        
        法二 巧用n&(n-1)
        res = 0
        while n:
            res += 1
            n &= n - 1
        return res

4 复杂度分析

法一 逐位判断

在这里插入图片描述

法二 巧用n&(n-1)
在这里插入图片描述

深入了解复杂度:数据分析学习总结笔记11:空间复杂度和时间复杂度


  1. 解题思路_作者:jyd ↩︎

你可能感兴趣的:(算法,python,leetcode,数据结构,数据挖掘)