题目描述
给定一个非负整数 num。对于 0 ≤ i ≤ num 范围中的每个数字 i ,计算其二进制数中的 1 的数目并将它们作为数组返回。
示例 1:
输入: 2
输出: [0,1,1]
示例 2:
输入: 5
输出: [0,1,1,2,1,2]
思路
假设i
的二进制中1
的位数有f(i)
,则f(i>>1)
中1
的位数有2种情况:
f
(
i
>
>
1
)
=
{
f
(
i
)
i的最后一位是0
f
(
i
)
−
1
i的最后一位是1
f(i>>1)=\begin{cases}f(i)& \text{i的最后一位是0}\\f(i)-1& \text{i的最后一位是1}\end{cases}
f(i>>1)={f(i)f(i)−1i的最后一位是0i的最后一位是1
已知 i>>1
小于i
,所以f(i>>1)
会先被计算出来,所以f(i)
的公式如下:
f
(
i
)
=
{
f
(
i
>
>
1
)
i的最后一位是0
f
(
i
>
>
1
)
+
1
i的最后一位是1
f(i)=\begin{cases} f(i>>1) & \text{i的最后一位是0}\\ f(i>>1)+1 & \text{i的最后一位是1} \end{cases}
f(i)={f(i>>1)f(i>>1)+1i的最后一位是0i的最后一位是1
代码
public int[] countBits(int num) {
int[] bitsCount = new int[num + 1];
for (int i = 1; i <= num; i++) {
bitsCount[i] = bitsCount[i >> 1] + (1 & i);
}
return bitsCount;
}