Counting Bits

本文介绍了一种在O(n)时间复杂度内计算从0到n的所有整数中1的位数的方法。通过观察2^n周期性的规律,利用递推公式进行高效计算。给出Java实现代码。

原文地址:点我传送

一道挺有趣的题目,逐个计算是没什么难度的,但如果要时间复杂度在O(n)就要动下脑子,不难发现规律即每从一个2^n数开始接下来的2^n个数,其1的个数都是每位下标减去2^n再+1得到的。例如:

0:0

1:1

2-3:1(0+1) 2(1+1)

4-7:1(0+1) 2(1+1) 2(1+1) 3(2+1)

8-15:1(0+1) 2(1+1) 2(1+1) 3(2+1) 2(1+1) 3(2+1) 3(2+1) 4(3+1)

...

找到思路后用代码实现即可。

Java:

public class Solution {
    public int[] countBits(int num) {
        int ans[] = new int [num+1];
        ans[0]=0;
        if(num==0)
        {
            return ans;
        }
        ans[1]=1;
        if(num==1)
        {
            return ans;
        }
        int count=0;
        int n = 2;
        for(int i=2;i<=num;i++)
        {
            ans[i]=ans[i-n]+1;
            count++;
            if(count==n)
            {
                count=0;
                n*=2;
            }
        }
        return ans;
    }
}


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值