比特位计数
1.题目描述
给你一个整数 n ,对于 0 <= i <= n 中的每个 i ,计算其二进制表示中 1 的个数 ,返回一个长度为 n + 1 的数组 ans 作为答案。
示例 1:
输入:n = 2
输出:[0,1,1]
解释:
0 --> 0
1 --> 1
2 --> 10
2.思路
Brian Kernighan 算法的原理是:对于任意整数 x,令 x=x & (x−1),该运算将 x 的二进制表示的最后一个 1 变成 0。因此,对 x 重复该操作,直到 x 变成 0,则操作次数即为 x 的「一比特数」。
3.代码
class Solution {
public int[] countBits(int n) {
int[] arr = new int[n+1];
for(int i = 0 ; i <= n ; i++){
int count = 0;
int num = i;
//对于任意整数 x,令 x=x & (x−1),
//该运算将 x 的二进制表示的最后一个 1 变成 0。
//因此,对 x重复该操作,直到 x 变成 0,则操作次数即为 x 的「一比特数」
while(num > 0){
num = num & (num - 1);
count++;
}
arr[i] = count;
}
return arr;
}
}