Counting Bits

问题描述

Given a non negative integer number num. For every numbers i in the range 0 ≤ i ≤ num calculate the number of 1’s in their binary representation and return them as an array.
Example:
For num = 5 you should return [0,1,1,2,1,2].

分析

a. 如果num是偶数,那么它可以由左移num的半数形成,如110(6)= 011(3)<< 1。 显然,两者中的1的数目是相同的;
b.如果num是奇数,那么它的计数就是1(小于1)的偶数1和LSB上的单个1的和,就像1101(13)= 1100(12)+ 0001(1),12可以按照a的情况形成; 1100(12)= 0110(6)<< 1;
把这两个案件放在一起:
num是偶数:ret [num] = ret [num / 2]
num是奇数:ret [num] = ret [(num -1)/ 2] + 1
所以它可以被降低为:ret [i] = ret [i / 2] + i%2

算法(C++)

vector<int> countBits(int num) {
        vector<int> ret(num+1, 0);
        for ( int i = 1; i <= num; i++ ) {
            ret[i] = ret[i/2] + i % 2;
        }
        return ret;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值