1. 剑指 Offer II 003. 前 n 个数字二进制中 1 的个数
题目描述
知识储备
- 位运算(左移,右移,位与)
位运算是基于二进制的操作,不懂二进制的可以先去看看什么是二进制再回来-
左移(<<):乘以2的位次幂(需要左移几位)
-
右移(>>):除以2的位次幂(向下取整:eg:7/2 = 3)
-
位与(&) : 二进制位比较(同为1则为1,否则为0)
-
解题思路
分治,充分合理的使用位运算。
所有数字的2倍数的二进制中,1的个数都是一样的,因此从小到大我们采用除法来控制倍数,使用当前数字 & 1来判断是奇数还是偶数,因为奇数最后是有一个1的。
编码实现
class Solution {
public int[] countBits(int n) {
int[] result = new int[n+1];
for (int i = 0; i <= n; i++) {
result[i] = result[i >> 1] + (i & 1);
}
return result;
}
}