Bit Manipulation

12. Counting Bits

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.

Examples

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 <= 10^5

Follow-up

  • A straightforward solution runs in O(n log n); try to achieve O(n) time and O(n) space.
  • You can compute counts in O(1) per number using dynamic programming relations such as ans[i] = ans[i >> 1] + (i & 1) or ans[i] = ans[i & (i - 1)] + 1.
  • Avoid using built-in population-count functions for the challenge.

Dado un entero n, devuelve un arreglo ans de longitud n + 1 tal que para cada i (0 <= i <= n), ans[i] es la cantidad de bits en 1 en la representacion binaria de i.

Ejemplos

Ejemplo 1

Entrada: n = 2
Salida: [0,1,1]
Explicacion:
0 -> 0
1 -> 1
2 -> 10

Ejemplo 2

Entrada: n = 5
Salida: [0,1,1,2,1,2]
Explicacion:
0 -> 0
1 -> 1
2 -> 10
3 -> 11
4 -> 100
5 -> 101

Restricciones

  • 0 <= n <= 10^5

Desafio adicional

  • Una solucion directa es O(n log n); intenta obtener O(n) en tiempo y O(n) en espacio.
  • Relaciones utiles: ans[i] = ans[i >> 1] + (i & 1) o ans[i] = ans[i & (i - 1)] + 1.
  • Evita utilizar funciones incorporadas de conteo de bits para el reto.
12-counting_bits.py
from typing import List

# Count the number of 1-bits for every number from 0 to n
n: int = 5
dp: List[int] = [0] * (n + 1)
offset: int = 1
for i in range(1, n + 1):
    if offset * 2 == i:
        offset = i
    dp[i] = 1 + dp[i - offset]
print(dp)
Keyboard shortcuts
h Previous problem
l Next problem
Esc Back to index
? Toggle this help