Easy
Given an integer n
, return an array ans
of length n + 1
such that for each i
(0 <= i <= n
), ans[i]
is the number of 1
’s in the binary representation of i
.
Example 1:
Input: n = 2
Output: [0,1,1]
Explanation:
0 --> 0
1 --> 1
2 --> 10
Example 2:
Input: n = 5
Output: [0,1,1,2,1,2]
Explanation:
0 --> 0
1 --> 1
2 --> 10
3 --> 11
4 --> 100
5 --> 101
Constraints:
0 <= n <= 105
Follow up:
O(n log n)
. Can you do it in linear time O(n)
and possibly in a single pass?__builtin_popcount
in C++)?class Solution {
/**
* @param Integer $n
* @return Integer[]
*/
public function countBits($num) {
$result = array_fill(0, $num + 1, 0);
$borderPos = 1;
$incrPos = 1;
for ($i = 1; $i < count($result); $i++) {
// when we reach pow of 2 , reset borderPos and incrPos
if ($incrPos == $borderPos) {
$result[$i] = 1;
$incrPos = 1;
$borderPos = $i;
} else {
$result[$i] = 1 + $result[$incrPos++];
}
}
return $result;
}
}