2021/03/03 每日一题 位计数

LeetCode位计数,中等难度,记录下解题思路

输入一个数num,需要求[0,num]区间内所有数对应的二进制数中1的数量

计算一个数的二进制中1的个数,可以直接将一个数转换为二进制例如5 = 2^2 + 2^0 = 101
也可以拆分为5 = 4 + 1
其中4直接是2^2对应的就是100,是除了第一位以外所有的数均为0的情况,之后加上2^0001,那么就可以得到101
那么运用动态规划的思路:
1 = 2^0
2 = 2^1
3 = 2^1 + 2^0
4 = 2^2
5 = 2^2 + 2^0
6 = 2^2 + 2^1
7 =2^2 + 2^1 + 2^0
如果一个数是2的整次幂,那么这个数二进制对应1的个数为1
如果一个数不是2的整次幂,那么这个数可以拆分为res[i] = res[i -最近一个整数次幂的数] + 1res数组是对应数字二进制中1的个数
例如:
res[5] = res[5-4] + 1 = 2
res[6] = res[6-4] + 1 = res[2] + 1 = 2
res[7] = res[7-4] + 1 = res[3] + 1 = res[3-2] + 1 + 1 = res[1] + 1 + 1 = 3

这样推导下来就能很清楚的看到动态规划的公式,所以最后实现的过程如下:

  1. 遍历[0,num]中间所有数,并且已知res[0] = 0
  2. 如果这个数是2的整数次幂就保存下来,记为high,并且这个数的count = 1
    判断整数次幂用i & (i - 1)) === 0
    例如4 = 1003 = 011来做与运算结果就是0
    5 = 1014 = 100做与运算结果为100不为0
  3. 如果这个数不是2的整数次幂,就查用保存的high和当前数相减res[i] = res[i - high] + 1这个公式来计算结果
var countBits = function(num) {
   // 创建结果数组
    const res= new Array(num + 1).fill(0);
   // 定义当前最高位为0
    let highBit = 0;
   // 从1开始遍历整个数
    for (let i = 1; i <= num; i++) {
        // 如果是2的整数次幂
        if ((i & (i - 1)) === 0) {
            // 保存当前数
            high = i;
            // 将当前数对应的结果设为1
            res[i] = 1
            // 跳出本次循环
            continue
        }
        // 计算结果
        res[i] = res[i - high] + 1;
    }
    return res;
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 196,165评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,503评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,295评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,589评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,439评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,342评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,749评论 3 387
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,397评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,700评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,740评论 2 313
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,523评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,364评论 3 314
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,755评论 3 300
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,024评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,297评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,721评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,918评论 2 336

推荐阅读更多精彩内容

  • 进制基本概念 什么是进制?进制是一种计数的方式,数值的表示形式 常见的进制十进制、二进制、八进制、十六进制 进制书...
    低头看云阅读 823评论 0 1
  • 我自己琢磨着,数学抽象概念最重要。如果概念理解清楚了,数学的抽象思维就进了一步。概念清楚了很多内容就可以穿起来了,...
    尘尘肥妈阅读 1,201评论 0 1
  • ### 内置函数 > 内置函数就是在系统安装完python解释器时,由python解释器给提供好的函数 ### [...
    lmonkey_01阅读 54评论 0 0
  • 难度中等题目描述: 给定一个非负整数 num。对于 0 ≤ i ≤ num 范围中的每个数字 i ,计算其二进制数...
    hqwer阅读 114评论 0 0
  • 进制基本概念 什么是进制?进制是一种计数的方式,数值的表示形式 常见的进制十进制、二进制、八进制、十六进制 进制书...
    Cc_5691阅读 3,520评论 0 3