Alguém tem alguma pergunta do tipo FizzBuzz que não seja o problema do FizzBuzz?
Estou entrevistando alguém e o FB é relativamente conhecido e não é tão difícil de memorizar, então minha primeira parada em busca de ideias é meu novo vício SO.
Alguém tem alguma pergunta do tipo FizzBuzz que não seja o problema do FizzBuzz?
Estou entrevistando alguém e o FB é relativamente conhecido e não é tão difícil de memorizar, então minha primeira parada em busca de ideias é meu novo vício SO.
Respostas:
Eu vi uma pequena lista de problemas de programação relativamente simples usados para eliminar candidatos, assim como o FizzBuzz. Aqui estão alguns dos problemas que tenho visto, em ordem crescente de dificuldade:
Elas eram para Java e você poderia usar as bibliotecas padrão, portanto, algumas delas podem ser extremamente fáceis (como 6). Mas eles funcionam como o FizzBuzz. Se você tem uma ideia sobre programação, deve ser capaz de fazer mais rapidamente. Mesmo que você não conheça bem o idioma, você deve pelo menos ser capaz de dar uma ideia por trás de como fazer algo.
Usando esse teste, um dos meus chefes anteriores viu tudo, desde pessoas que conseguiam fazer tudo muito rápido, até pessoas que conseguiam fazer muito rápido, até um cara que não conseguia responder a uma única pergunta depois de meia hora.
Também devo observar: ele deixava que as pessoas usassem seu computador enquanto realizavam essas tarefas. Eles foram especificamente instruídos de que poderiam usar o Google e similares.
Talvez isso não responda diretamente à sua pergunta, mas não tenho certeza se você precisa encontrar outro problema. Além de ser "fácil de memorizar", a pergunta do FizzBuzz é simplesmente "fácil", e esse é o ponto. Se a pessoa que você está entrevistando está na classe de pessoas para as quais o FizzBuzz é "bem conhecido", então ela está na classe de pessoas que uma pergunta do tipo FizzBuzz não filtraria. Isso não significa que você os contrate na hora, mas significa que eles devem ser capazes de passar rapidamente por isso e ir direto ao assunto da entrevista.
Colocando de outra forma, vale a pena entrevistar qualquer pessoa que reserve um tempo para ler Coding Horror . Peça-lhes que escrevam a solução muito rapidamente, discuta-a brevemente (por exemplo, como você testa isso?) E, em seguida, passe para a próxima pergunta. E, como diz o artigo, "é verdadeiramente surpreendente quantos candidatos são incapazes das tarefas de programação mais simples."
Qualquer um dos primeiros do Projeto Euler provavelmente seria bom.
Por exemplo:
Problema 25
A sequência de Fibonacci é definida pela relação de recorrência:
Fn = Fn−1 + Fn−2, where F1 = 1 and F2 = 1.
Portanto, os primeiros 12 termos serão:
F1 = 1 F2 = 1 F3 = 2 F4 = 3 F5 = 5 F6 = 8 F7 = 13 F8 = 21 F9 = 34 F10 = 55 F11 = 89 F12 = 144
O 12º termo, F12, é o primeiro termo a conter três dígitos.
Qual é o índice do primeiro termo na sequência de Fibonacci para conter 1000 dígitos?
Descobri que verificar se uma string é um palíndromo é bastante simples e pode ser um removedor decente.
scalar(reverse 'foo') == 'foo'
.
Eu queria uma pergunta do FizzBuzz que não envolvesse o operador do módulo. Especialmente porque normalmente estou entrevistando desenvolvedores da web para os quais o operador de módulo simplesmente não aparece com tanta frequência. E se não é algo que você encontra regularmente, é uma daquelas coisas que você procura nas poucas vezes em que precisa.
(Concedido, é um conceito que, idealmente, você deveria ter encontrado em um curso de matemática em algum lugar ao longo do caminho, mas esse é um tópico diferente.)
Então, o que eu inventei é o que chamo, sem imaginação, Três em Reverso . A instrução é:
Escreva um programa que imprima, em ordem reversa , todos os múltiplos de 3 entre 1 e 200.
Fazê-lo na ordem normal é fácil: multiplique o índice do loop por 3 até chegar a um número que exceda 200 e saia. Você não precisa se preocupar com quantas iterações encerrar depois, apenas continue até atingir o primeiro valor que é muito alto.
Mas voltando atrás, você tem que saber por onde começar. Alguns podem perceber intuitivamente que 198 (3 * 66) é o maior múltiplo de 3 e, como tal, embutir 66 no loop. Outros podem usar uma operação matemática (divisão inteira ou um piso () em uma divisão de ponto flutuante de 200 e 3) para descobrir esse número e, ao fazer isso, fornecer algo mais genericamente aplicável.
Essencialmente, é o mesmo tipo de problema que o FizzBuzz (repetir os valores e imprimi-los, com uma variação). Este é um problema a ser resolvido que não usa nada tão (relativamente) esotérico quanto a operação do módulo.
print [x for x in xrange(3, 200, 3)][::-1]
Fibonacci, reverter uma string, contar o número de bits definido em um byte são outros comuns. O Projeto Euler também tem uma grande coleção de dificuldade crescente.
Para algo realmente super simples que pode ser feito em 10 segundos, mas removeria aquelas pessoas que literalmente não podem programar nada , tente este:
Pergunte: mostre-me (no papel, mas melhor no quadro branco) como você trocaria os valores de duas variáveis.
Não foi ideia minha, mas foi postado em um comentário por alguém chamado Jacob em um post de blog sobre a pergunta original do FizzBuzz.
Jacob continua a dizer:
Se eles não começarem com a criação de uma terceira variável, você pode praticamente descartar essa pessoa. Descobri que posso reduzir de um terço à metade dos meus candidatos (reconhecidamente não verificados) apenas com essa pergunta.
Há uma outra discussão interessante após aquele comentário na postagem original do blog sobre maneiras de realizar essa troca de variável sem exigir uma terceira variável (adicionar / subtrair, xor etc.) e, claro, se você estiver usando uma linguagem que suporte isso em uma única instrução / operação, pode não ser um teste tão bom.
Embora não seja ideia minha, eu queria postar isso aqui, pois é uma pergunta simples e elegante que pode (e deve) ser respondida em cerca de 10 segundos por alguém que escreveu até mesmo o mais simples dos programas. Também não requer o uso de operadores um tanto aparentemente obscuros como o operador de módulo, com o qual muitas pessoas, que por outro lado são programadores bastante decentes, simplesmente não estão familiarizados (o que eu sei por experiência própria).
Peça-lhes que escrevam um aplicativo para retornar os fatores de um determinado número. É fácil de fazer e difícil de fazer bem em um curto período de tempo. Você pode ver o estilo deles e a maneira como eles pensam nos problemas em um curto espaço de tempo.
Se for uma entrevista C / C ++, certifique-se de que a pessoa conhece os ponteiros.
Geral - algoritmo simples (lista encadeada [simples / dupla]). Pergunte sobre a complexidade de adicionar em cada caso (no início, no final, otimizações ...)?
(Geral) Como você encontra o mínimo e o máximo em uma matriz (tamanho N) com apenas 3 * N / 2 comparações?
C / C ++: Como você otimizaria vários "strcat" s para um buffer?
Confira 6.14 do C ++ FAQ Lite:
Que tal: eu quero usar um único inteiro para armazenar vários valores. Descreva como isso funcionaria.
Se eles não tiverem a menor ideia sobre máscaras de bits e operações, provavelmente não conseguirão resolver outros problemas.
Pedi aos meus candidatos que criassem um programa para calcular o fatorial de um determinado número em qualquer pseudo-linguagem de sua escolha. É um problema bastante fácil de resolver e se presta bem às perguntas de acompanhamento natural (que podem ser feitas com frequência) sobre a recursão.