68 lines
1.4 KiB
JavaScript
68 lines
1.4 KiB
JavaScript
/*
|
||
* @lc app=leetcode id=338 lang=javascript
|
||
*
|
||
* [338] Counting Bits
|
||
*
|
||
* https://leetcode.com/problems/counting-bits/description/
|
||
*
|
||
* algorithms
|
||
* Medium (64.04%)
|
||
* Total Accepted: 163.1K
|
||
* Total Submissions: 253K
|
||
* Testcase Example: '2'
|
||
*
|
||
* Given a non negative integer number num. For every numbers i in the range 0
|
||
* ≤ i ≤ num calculate the number of 1's in their binary representation and
|
||
* return them as an array.
|
||
*
|
||
* Example 1:
|
||
*
|
||
*
|
||
* Input: 2
|
||
* Output: [0,1,1]
|
||
*
|
||
* Example 2:
|
||
*
|
||
*
|
||
* Input: 5
|
||
* Output: [0,1,1,2,1,2]
|
||
*
|
||
*
|
||
* Follow up:
|
||
*
|
||
*
|
||
* It is very easy to come up with a solution with run time
|
||
* O(n*sizeof(integer)). But can you do it in linear time O(n) /possibly in a
|
||
* single pass?
|
||
* Space complexity should be O(n).
|
||
* Can you do it like a boss? Do it without using any builtin function like
|
||
* __builtin_popcount in c++ or in any other language.
|
||
*
|
||
*/
|
||
/**
|
||
* @param {number} num
|
||
* @return {number[]}
|
||
*/
|
||
var countBits = function(num) {
|
||
// tag: bit dp
|
||
// Time complexity: O(n)
|
||
// Space complexity: O(n)
|
||
const res = [];
|
||
res[0] = 0;
|
||
|
||
// 10000100110101
|
||
for (let i = 1; i <= num; i++) {
|
||
if ((i & 1) === 0) {
|
||
// 偶数
|
||
// 偶数最后一位是0,因此右移一位对结果没有影响
|
||
res[i] = res[i >> 1];
|
||
} else {
|
||
// 奇数
|
||
// 奇数最后一位是1,i - 1 的 位数 + 1 就是结果
|
||
res[i] = res[i - 1] + 1;
|
||
}
|
||
}
|
||
|
||
return res;
|
||
};
|