原文地址:点我传送
一道挺有趣的题目,逐个计算是没什么难度的,但如果要时间复杂度在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;
}
}
本文介绍了一种在O(n)时间复杂度内计算从0到n的所有整数中1的位数的方法。通过观察2^n周期性的规律,利用递推公式进行高效计算。给出Java实现代码。
159

被折叠的 条评论
为什么被折叠?



