Count Even Numbers
Dada una lista no vacía de números enteros nums, devuelve cuántos de sus valores son pares. Un número es par cuando al dividirlo entre 2 no queda ningún resto, lo que incluye 0 y números negativos como -4.
Función
- numsinteger-array
- la lista de números enteros que se deben comprobar
- Devuelveinteger
- la cantidad de valores pares en nums
Restricciones
1 ≤ nums.length ≤ 5000-109 ≤ nums[i] ≤ 109
Ejemplos
- Entrada
- nums = [3, 8, 12, 5, 6]
- Salida
- 3
- Explicación
8,12y6se dividen entre2sin que sobre nada;3y5no. La respuesta es3.
- Entrada
- nums = [-4, -3, 0, 7]
- Salida
- 2
- Explicación
-4 = 2 × (-2)y0 = 2 × 0, así que ambos son pares.-3y7son impares, y la cantidad es2.
- Entrada
- nums = [1, 9, 15]
- Salida
- 0
- Explicación
1,9y15son todos impares, así que la respuesta es0.
Para ir más allá
Recibes muchas preguntas: ¿cuántos valores pares hay entre el índice l y el índice r? Después de una pasada por nums, ¿puedes responder cada una en tiempo O(1)?
Pistas
Ábrelas de una en una. Cada una revela un poco más.
¿Qué sobra cuando divides un número par entre
2?Un valor
xes par exactamente cuandox % 2es0. Ten cuidado: para un número impar negativo, algunos lenguajes dan-1como resto, no1.Inicia un contador en
0, lee cada valor una vez y suma1siempre que el resto al dividir entre2sea0.
Solución
Comprueba cada valor una vez y cuenta aquellos cuyo resto al dividirlos entre 2 es 0. Comparar el resto con 0, en lugar de comprobar si son impares con 1, funciona correctamente con los números negativos.
Recopila los valores pares y después cuéntalos
Intuición
Selecciona los valores pares con un filtro y después devuelve la longitud del resultado. Para [3, 8, 12, 5, 6], la lista filtrada es [8, 12, 6], así que la respuesta es 3.
El tiempo es O(n), pero la nueva lista ocupa O(n) de memoria, hasta 5000 valores, solo para leer su longitud una vez.
Algoritmo
- Construye una nueva lista que contenga cada
xdenumspara el quex % 2 == 0. - Devuelve la longitud de esa lista.
def countEvens(nums):
evens = [x for x in nums if x % 2 == 0]
return len(evens)Cuenta con un contador acumulativo
Intuición
Usa un contador en lugar de una lista y suma 1 por cada valor que cumpla x % 2 == 0. Un número par deja un resto de 0 independientemente de su signo, así que la prueba se cumple para -4 y 0 en todos los lenguajes. Una prueba de impar escrita como x % 2 == 1 no funciona: en C, Java, JavaScript y la mayoría de los lenguajes similares a C, el resto tiene el signo del número, por lo que -3 % 2 es -1.
Una pasada y un entero: tiempo O(n), espacio O(1).
Algoritmo
- Establece
counten0. - Recorre cada valor
xennums. - Si
x % 2 == 0, suma1acount. - Después del bucle, devuelve
count.
def countEvens(nums):
count = 0
for x in nums:
if x % 2 == 0: # 0 also works for negatives, where the remainder can be -1
count += 1
return count
Errores comunes y casos límite
- Contar los valores impares con
x % 2 == 1y restarlos de la longitud. En los lenguajes tipo C,-3 % 2es-1, por lo que[-3]devuelve 1 en lugar de 0. - Tratar
0como si no fuera ni par ni impar.0 = 2 × 0, por lo que[0]devuelve1. - Escribir la prueba de bits como
x & 1 == 0. En C, C++ y JavaScript,==tiene mayor precedencia que&, por lo que significax & (1 == 0), que siempre es0y no cuenta nada. Escribe(x & 1) == 0.
Preguntas frecuentes3
¿Cómo se comprueba en código si un número es par?
Comprueba si el resto después de dividir entre 2 es cero: x % 2 == 0. Funciona con números positivos, negativos y cero, incluso en lenguajes donde -3 % 2 es -1. También puedes comprobar el bit menos significativo con (x & 1) == 0.
¿Es cero un número par?
Sí. Cero dividido entre 2 es 0 sin resto, así que cumple la definición de par. También se encuentra entre los números impares -1 y 1, donde corresponde un número par.
¿Cuál es la complejidad temporal de contar los números pares en un arreglo?
Una pasada con un contador requiere un tiempo de O(n) y un espacio adicional de O(1). Hay que comprobar cada valor, así que ningún método es más rápido que O(n).
Problemas similares
Problemas que usan las mismas ideas. Resolver dos o tres es lo que fija un patrón.
def countEvens(nums):
# Escribe el código aquíPrueba #1
Prueba #2
Prueba #3
Argumento
nums = [3, 8, 12, 5, 6]
Salida Esperada
3