FizzBuzz
No jogo de contagem FizzBuzz, os jogadores contam a partir de 1 e substituem alguns números por palavras. Dado um número da rodada n, retorne o que um jogador diz nessa rodada: "FizzBuzz" se n for divisível por 3 e por 5, "Fizz" se for divisível apenas por 3, "Buzz" se for divisível apenas por 5 e, caso contrário, o próprio n escrito como uma string, como "7".
Função
- ninteger
- o número do turno, um inteiro positivo
- Retornastring
- a palavra ou o número dito no turno n, como uma string
Restrições
1 ≤ n ≤ 109- A resposta é sempre uma string, mesmo quando é o próprio número.
Exemplos
- Entrada
- n = 15
- Saída
- "FizzBuzz"
- Explicação
- 15 dividido por 3 é 5 e 15 dividido por 5 é 3, ambos sem resto, então a vez do 15 é
"FizzBuzz".
- Entrada
- n = 7
- Saída
- "7"
- Explicação
- 7 deixa resto 1 quando dividido por 3 e 2 quando dividido por 5, então nenhuma palavra se aplica e você retorna o número como texto,
"7".
Para ir além
Uma nova regra faz com que os múltiplos de 7 sejam "Bazz"; as palavras são concatenadas em ordem, então 105 é "FizzBuzzBazz". Como você adiciona isso sem criar um caso para cada combinação?
Dicas
Abra uma de cada vez. Cada uma revela um pouco mais.
O operador de resto indica se um número divide outro:
né divisível por 3 exatamente quando o resto dendividido por 3 é 0.Pense em 15. Ele é divisível por 3 e por 5. Qual das suas verificações deve ser executada primeiro para que 15 receba
"FizzBuzz"e não"Fizz"?Teste a divisibilidade por 15 primeiro, depois por 3 e, em seguida, por 5. Se nenhum corresponder, converta o número em uma string. Certifique-se de que a conversão escreva todos os dígitos, para que 10^9 resulte em
"1000000000"e não em notação científica.
Solução
Cada regra é uma verificação de resto. A armadilha está na ordem: 15 é divisível por 3, então uma função que testa 3 primeiro e retorna imediatamente responde "Fizz" para 15. Teste primeiro o caso combinado ou monte a resposta a partir das duas verificações.
Monte a palavra com base nas duas verificações
Intuição
Comece com uma palavra vazia. Se 3 divide n, adicione "Fizz"; se 5 divide n, adicione "Buzz". As duas verificações sempre são executadas, então um múltiplo de 15 reúne ambas as partes nessa ordem e se torna "FizzBuzz" sem nenhum caso especial. Se a palavra ainda estiver vazia, nenhuma das regras se aplicou, e você retorna o número como uma string.
Algoritmo
- Defina
wordcomo uma string vazia. - Se
n % 3 == 0, acrescente"Fizz". - Se
n % 5 == 0, acrescente"Buzz". - Se
wordestiver vazia, retornenconvertido em uma string. - Caso contrário, retorne
word.
def fizzBuzz(n):
word = ""
if n % 3 == 0:
word += "Fizz"
if n % 5 == 0:
word += "Buzz"
# An empty word means neither 3 nor 5 divides n.
if word == "":
return str(n)
return wordVerifique 15, depois 3, depois 5
Intuição
Um número divisível por 3 e por 5 é exatamente um número divisível por 15, porque 3 e 5 não têm fatores em comum. Portanto, a regra combinada é uma única verificação, n % 15 == 0, e ela vem primeiro. Quando ela falha, uma correspondência com 3 significa apenas 3, e uma correspondência com 5 significa apenas 5. Cada verificação retorna imediatamente e, se nenhuma corresponder, você retorna o número como uma string.
Algoritmo
- Se
n % 15 == 0, retorne"FizzBuzz". - Se
n % 3 == 0, retorne"Fizz". - Se
n % 5 == 0, retorne"Buzz". - Caso contrário, retorne
nconvertido em uma string, com cada dígito escrito por extenso.
def fizzBuzz(n):
if n % 15 == 0:
return "FizzBuzz"
if n % 3 == 0:
return "Fizz"
if n % 5 == 0:
return "Buzz"
return str(n)
Armadilhas e casos extremos
- Testar 3 ou 5 antes de 15 e retornar imediatamente: 15, 30 e 45 resultam em
"Fizz". - Retornar o número em vez de uma string. O turno 7 é
"7". - Converter números grandes para notação científica. Em R, uma conversão simples exibe 10^9 como
1e+09; useformat(n, scientific = FALSE). - Imprimir a resposta em vez de retorná-la.
Perguntas frequentes3
Por que FizzBuzz é perguntado em entrevistas de programação?
Ele verifica se você consegue transformar um pequeno conjunto de regras em código funcional: um teste de resto, condições na ordem certa e o tipo de retorno correto. Leva alguns minutos para alguém que programa regularmente, então funciona como uma avaliação rápida antes de perguntas mais difíceis.
Você consegue resolver FizzBuzz sem o operador módulo?
Sim. Divida usando divisão inteira, multiplique o quociente de volta e compare-o com n: eles são iguais somente quando não sobra nada. Ao imprimir a sequência inteira, você também pode manter dois contadores que são reiniciados em 3 e em 5.
Qual é a complexidade de tempo de FizzBuzz?
Responder para um número é O(1): uma quantidade fixa de verificações de resto e a conversão de um número com no máximo 10 dígitos. Imprimir a sequência de 1 a n é O(n).
Problemas parecidos
Problemas que usam as mesmas ideias. Resolver dois ou três é o que fixa um padrão.
def fizzBuzz(n):
# Escreva o código aquiTeste #1
Teste #2
Argumento
n = 15
Saída Esperada
"FizzBuzz"