Count Even Numbers
Dada uma lista não vazia de números inteiros nums, retorne quantos de seus valores são pares. Um número é par quando, ao dividi-lo por 2, não há resto, o que inclui 0 e números negativos, como -4.
Função
- numsinteger-array
- a lista de números inteiros a verificar
- Retornainteger
- o número de valores pares em nums
Restrições
1 ≤ nums.length ≤ 5000-109 ≤ nums[i] ≤ 109
Exemplos
- Entrada
- nums = [3, 8, 12, 5, 6]
- Saída
- 3
- Explicação
8,12e6são divisíveis por2sem deixar resto;3e5não são. A resposta é3.
- Entrada
- nums = [-4, -3, 0, 7]
- Saída
- 2
- Explicação
-4 = 2 × (-2)e0 = 2 × 0, portanto ambos são pares.-3e7são ímpares, e a contagem é2.
- Entrada
- nums = [1, 9, 15]
- Saída
- 0
- Explicação
1,9e15são todos ímpares, então a resposta é0.
Para ir além
Você recebe muitas perguntas: quantos valores pares existem entre o índice l e o índice r? Depois de uma passagem por nums, você consegue responder a cada uma em tempo O(1)?
Dicas
Abra uma de cada vez. Cada uma revela um pouco mais.
O que sobra quando você divide um número par por
2?Um valor
xé par exatamente quandox % 2é0. Atenção: para um número ímpar negativo, algumas linguagens retornam-1como resto, e não1.Inicie um contador em
0, leia cada valor uma vez e adicione1sempre que o resto da divisão por2for0.
Solução
Verifique cada valor uma vez e conte aqueles cujo resto é 0 quando divididos por 2. Comparar o resto com 0, em vez de testar se é ímpar com 1, funciona corretamente com números negativos.
Reúna os valores pares e, em seguida, conte-os
Intuição
Selecione os valores pares com um filtro e, em seguida, retorne o comprimento do resultado. Para [3, 8, 12, 5, 6], a lista filtrada é [8, 12, 6], então a resposta é 3.
O tempo é O(n), mas a nova lista custa O(n) de memória, para até 5000 valores, apenas para ler seu comprimento uma vez.
Algoritmo
- Crie uma nova lista contendo cada
xemnumspara o qualx % 2 == 0. - Retorne o tamanho dessa lista.
def countEvens(nums):
evens = [x for x in nums if x % 2 == 0]
return len(evens)Conte com um contador progressivo
Intuição
Mantenha um contador em vez de uma lista e some 1 para cada valor que satisfaça x % 2 == 0. Um número par deixa resto 0, qualquer que seja o seu sinal, então o teste funciona para -4 e 0 em todas as linguagens. Um teste para ímpares escrito como x % 2 == 1 não funciona: em C, Java, JavaScript e na maioria das linguagens semelhantes a C, o resto tem o sinal do número, então -3 % 2 é -1.
Uma passagem e um inteiro: tempo O(n), espaço O(1).
Algoritmo
- Defina
countcomo0. - Percorra cada valor
xemnums. - Se
x % 2 == 0, adicione1acount. - Após o loop, retorne
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
Armadilhas e casos extremos
- Contar os valores ímpares com
x % 2 == 1e subtrair da quantidade de elementos. Em linguagens semelhantes a C,-3 % 2é-1, então[-3]retorna 1 em vez de 0. - Tratar
0como não sendo nem par nem ímpar.0 = 2 × 0, então[0]retorna1. - Escrever o teste de bit como
x & 1 == 0. Em C, C++ e JavaScript,==tem precedência maior que&, então isso significax & (1 == 0), que é sempre0e não conta nada. Escreva(x & 1) == 0.
Perguntas frequentes3
Como verificar se um número é par no código?
Teste se o resto após dividir por 2 é zero: x % 2 == 0. Isso funciona para números positivos, números negativos e zero, até mesmo em linguagens nas quais -3 % 2 é -1. Você também pode verificar o bit menos significativo com (x & 1) == 0.
Zero é um número par?
Sim. Zero dividido por 2 é 0, sem resto, então se encaixa na definição de número par. Ele também fica entre os números ímpares -1 e 1, onde um número par se encaixa.
Qual é a complexidade de tempo para contar números pares em um array?
Uma passagem com um contador leva tempo O(n) e usa espaço extra O(1). Todos os valores precisam ser verificados, então nenhum método é mais rápido que O(n).
Problemas parecidos
Problemas que usam as mesmas ideias. Resolver dois ou três é o que fixa um padrão.
def countEvens(nums):
# Escreva o código aquiTeste #1
Teste #2
Teste #3
Argumento
nums = [3, 8, 12, 5, 6]
Saída Esperada
3