题目:
给你一个整数 n
,对于 0 <= i <= n
中的每个 i
,计算其二进制表示中 1
的个数 ,返回一个长度为 n + 1
的数组 ans
作为答案。
题解:
理解题目的意思:
比如n = 5,0-5的数转为二进制,6个数字的二进制中1的个数分别对应结果数组6个位置的值
思路:
对于所有的数字,只有两类:
奇数:二进制表示中,奇数一定比前面那个偶数多一个 1,因为多的就是最低位的 1。
举例:
0 = 0 1 = 1
2 = 10 3 = 11
偶数:二进制表示中,偶数中 1 的个数一定和除以 2 之后的那个数一样多。因为最低位是 0,除以 2 就是右移一位,也就是把那个 0 抹掉而已,所以 1 的个数是不变的。
举例:
2 = 10 4 = 100 8 = 1000
3 = 11 6 = 110 12 = 1100
另外,0 的 1 个数为 0,于是就可以根据奇偶性开始遍历计算了。
类似于动态规划。
class Solution {
public int[] countBits(int n) {
int[] res = new int[n + 1];
res[0] = 0;
for (int i = 1; i < n + 1; i++) {
if (i % 2 == 1) { //奇数一定比前面那个偶数多一个 1
res[i] = res[i - 1] + 1;
} else { //偶数中 1 的个数一定和除以 2 之后的那个数一样多
res[i] = res[i / 2];
}
}
return res;
}
}
参考:力扣