lc338 比特位计数

lc338 比特位计数

问题:

给一个整数n,遍历0-n的每一个值,统计每个值二进制中1的个数,返回长度为n+1的数组。

 

题解:

 

 Brian Kernighan’s 算法。这个算法的核心思想是每次去掉二进制中最右边的一个1,直到所有的1都被处理完。

 

int [] a = new int[n+1];

for(int i = 0;i<=n;i++){

a[i] = countone(i);

}

return a;

 

//对每一个值采用BK算法计算位数为1的个数

public int countone(int i){

int one=0;

while(x>0){

x&=(x-1);

one++;

}

return one;

}

你可能感兴趣的:(java)