题目:给一个数字n,返回0到n这n+1个数每个数的二进制形式有几个1,比如n=5,返回【0,1,1,2,1,1】因为0,1,2,3,4,5这几个数对应的二进制分别有0,1,1,2,1,1个1
思路:暴力算每个数的话就没意思了,这里要用dp,可是公式或者说规律比较难找。。f(i)=f(i/2)+i%2;
一个数乘2之后和原来的数的二进制中的1个数相同
因为乘2相当于左移补零,不会增加1的个数
所以偶数的二进制1的位数等于它除2的那个数的二进制位数
奇数就是某个偶数乘2之后再加1,所以一个奇数的二进制1的位数就等于
它除2取整那个数的二进制1的位数再加1
public int[] countBits(int num) { int[] f = new int[num + 1]; for (int i=1; i<=num; i++) f[i] = f[i >> 1] + (i & 1); return f; }