[338. 比特位计数]

简介: [338. 比特位计数]

正文


给定一个非负整数 num。对于 0 ≤ i ≤ num 范围中的每个数字 i ,计算其二进制数中的 1 的数目并将它们作为数组返回。


示例 1:

输入: 2

输出: [0,1,1]


示例 2:

输入: 5

输出: [0,1,1,2,1,2]


进阶:

给出时间复杂度为O(n*sizeof(integer))的解答非常容易。但你可以在线性时间O(n)内用一趟扫描做到吗?要求算法的空间复杂度为O(n)。你能进一步完善解法吗?要求在C++或任何其他语言中不使用任何内置函数(如 C++ 中的 __builtin_popcount)来执行此操作。



代码编写


package com.breakpoint.code;
import java.util.Arrays;
/**
* 338 338. 比特位计数
*
* @author breakpoint
*
*/
public class Main338 {
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] arr = new Main338().countBits(12);
System.out.println(Arrays.toString(arr));
}
public int[] countBits(int num) {
int[] arr = new int[num + 1];
arr[0] = 0;
// for
for (int i = 1, j = 0; i <= num; i++) {
// 判断是否是整数的
if (i == (int) Math.pow(2, j)) {
arr[i] = 1;
j++;
} else {
int k = (int) Math.pow(2, j - 1);
arr[i] = arr[k] + arr[i - k];
}
}
return arr;
}
}


代码思路:


22.png



相关文章
|
7月前
|
算法 前端开发
3005. 最大频率元素计数
3005. 最大频率元素计数
49 0
|
7月前
|
C++
比特位计数(C++)
比特位计数(C++)
61 0
|
7月前
leetcode-338:比特位计数
leetcode-338:比特位计数
39 0
【计算机网络】常见的编码方式:归零、不归零;曼切斯特、差分曼切斯特
【计算机网络】常见的编码方式:归零、不归零;曼切斯特、差分曼切斯特
438 0
|
存储 程序员
5.1.1_进位计数制
计算机组成原理之进位计数制
257 0
每日三题-最大矩形、比特位计数、回文子串
每日三题-最大矩形、比特位计数、回文子串
82 0
每日三题-最大矩形、比特位计数、回文子串
338. 比特位计数
给定一个非负整数 num。对于 0 ≤ i ≤ num 范围中的每个数字 i ,计算其二进制数中的 1 的数目并将它们作为数组返回。
98 0
|
C++
201604-1 折点计数
201604-1 折点计数
77 0
201604-1 折点计数