###### tags: `leetcode`
# LeetCode #338 Counting Bits
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.
## Python, for-loop and count ones, t=O(nlgn),s=O(1)
```python=
class Solution:
def countBits(self, num: int) -> List[int]:
def countOnes(x):
count = 0
while x != 0:
count += 1
x = x & (x-1)
return count
ans = []
for i in range(num + 1):
ans.append(countOnes(i))
return ans
```
## Python, ???
### my thinking
It is easy to observe an pattern in the sequence.
Let $f$ be the function.
Let $.+$ be element-wise addition.
```e
f(0) = [0]
f(1) = [0,1] = [f(0), f(0).+1]
f(3) = [0,1,1,2] = [f(1), f(1).+1]
f(7) = [0,1,1,2,1,2,2,3] = [f(3), f(3).+1]
```
### try on 2^N
```python=
def fun(x): # assume x is power of 2
if x == 0:
return [0]
else:
a = fun((x+1)/2-1) # int
for i in range(len(a)):
a.append(a[i] + 1)
return a
print(fun(3))
```
#### to improve
How to add an integer to each element in a list? =
https://stackoverflow.com/questions/9304408/how-to-add-an-integer-to-each-element-in-a-list
new_list = [x+1 for x in my_list]