记一道简单题,关于位运算:
采用动态规划
1、当第i个数为偶数时,它等于i/2左移一位,i与i/2二进制表示中1的个数是相同的。
2、当第i个数为奇数时,它等于i/2左移一位,尾部加1,所以i/2中1 的个数比i多一位,
也等价于比前一位偶数在尾部多添加一位1.
class Solution {
public int[] countBits(int n) {
int[] f = new int[n+1];
f[0]=0;
//如果i是偶数,那么i等于i/2左移一位的结果,其1的个数是相同的
//i是奇数时,相当于将i/2左移一位,在尾部加上1的结果,因此多一个。
//i是奇数时,也等价于比前一位的偶数在尾部多添加一个1,比前一个偶数多1。
for(int i=1; i <= n ; i ++){
if(i%2==0){
f[i]=f[i/2];
}else{
f[i]=f[i/2]+1;
//f[i]=f[i-1]+1;
}
}
return f;
}
}
由于 i/2 等价于 i>>2, i%2等价于 i&1.
代码可以化简为
class Solution {
public int[] countBits(int n) {
int[] f = new int[n+1];
f[0]=0;
for(int i=1; i <= n ; i ++){
f[i]=f[i>>1]+(i&1);
}
return f;
}
}