当前位置: 首页 > article >正文

leetcode338. 比特位计数

给你一个整数 n ,对于 0 <= i <= n 中的每个 i ,计算其二进制表示中 1 的个数 ,返回一个长度为 n + 1 的数组 ans 作为答案。

示例 1:

输入:n = 2
输出:[0,1,1]
解释:
0 --> 0
1 --> 1
2 --> 10

示例 2:

输入:n = 5
输出:[0,1,1,2,1,2]
解释:
0 --> 0
1 --> 1
2 --> 10
3 --> 11
4 --> 100
5 --> 101

提示:

  • 0 <= n <= 105

进阶:

  • 很容易就能实现时间复杂度为 O(n log n) 的解决方案,你可以在线性时间复杂度 O(n) 内用一趟扫描解决此问题吗?
  • 你能不使用任何内置函数解决此问题吗?(如,C++ 中的 __builtin_popcount )
/**
 * @param {number} n
 * @return {number[]}
 */ 
var countBits = function(n) {
    const bits = new Array(n + 1).fill(0);
    for (let i = 0; i <= n; i++) {
        bits[i] = countOnes(i);
    }
    return bits
};

const countOnes = (x) => {
    let ones = 0;
    while (x > 0) {
        x &= (x - 1);
        ones++;
    }
    return ones;
}
 

代码解读:

const countOnes = (x) => {
    let ones = 0;
    while (x > 0) {
        x &= (x - 1);
        ones++;
    }
    return ones;
}
  

函数接受一个整数参数x,并返回该整数二进制表示中1的个数。

代码逻辑如下:

  1. 初始化一个变量ones为0,用于计数二进制中1的个数。
  2. 使用while循环,当x大于0时执行循环体。
  3. 在循环体中,首先对x进行按位与操作(&),将xx - 1的结果赋值给x。这个操作的效果是将x的最低位的1变为0。例如,如果x是5(二进制表示为101),那么x - 1就是4(二进制表示为100),两者按位与的结果就是4(二进制表示为100)。
  4. 每执行一次按位与操作,就将ones加1,表示找到了一个1。
  5. x变为0时,说明所有的1都已经被找到并计数,此时跳出循环。
  6. 返回ones作为结果。

举个例子,如果输入的x是5(二进制表示为101),那么函数会返回2,因为有两个1。

在二进制中,按位与操作(&)是逐位进行的。只有当两个相应的位都是1时,结果位才是1;如果任一位是0,则结果位是0。

对于101和100的按位与操作:

  101
& 100
-----
  100

例如:因此,101和100按位与的结果是100。


http://www.kler.cn/a/323286.html

相关文章:

  • MySQL的游标和While循环的详细对比
  • 从建立TRUST到实现FAIR:可持续海洋经济的数据管理
  • 在Node.js中如何使用TypeScript
  • 【Pip】如何清理 `pip` 包管理器 —— 完整指南
  • vxe-grid table 校验指定行单元格的字段,只校验某个列的字段
  • 超好用shell脚本NuShell mac安装
  • openlayers知识总结、教程
  • 8-回溯算法
  • Github Webhook触发Jenkins自动构建
  • mac输入法 cpu占用,解决mac使用输入法出现卡顿延迟
  • 2:数据结构:列表与元组
  • 初识Tomcat
  • 【git lfs 问题记录】
  • 大数据复习知识点1
  • 独立站如何批量查收录?常用的3个的方法及其具体操作步骤
  • Linux学习笔记之重点概念、实用技巧和常见问题解答。
  • debian linux 只安装mysql client
  • 《AI办公类工具PPT系列之六——轻竹办公》
  • 从静态多态、动态多态到虚函数表、虚函数指针
  • 深度学习------------------------RNN(循环神经网络)
  • OJ在线评测系统 在Linux虚拟机搭建Docker 概念 入门 安装
  • 代码随想录算法训练营Day13
  • 代码为笔,合作作墨,共绘共赢画卷———未来之窗行业应用跨平台架构
  • 【论文阅读】StoryMaker | 更全面的人物一致性开源工作
  • element-plus中日历组件设置起始为周一
  • git配置ssh免密