Autres questions FizzBuzz [fermé]


88

Quelqu'un a-t-il de bonnes questions de type FizzBuzz qui ne sont pas le problème de FizzBuzz?

J'interviewe quelqu'un et FB est relativement bien connu et pas si difficile à mémoriser, donc mon premier arrêt dans une recherche d'idées est ma nouvelle addiction SO.

Réponses:


103

J'ai vu une petite liste de problèmes de programmation relativement simples utilisés pour éliminer les candidats, tout comme FizzBuzz. Voici quelques-uns des problèmes que j'ai vus, par ordre de difficulté croissante:

  1. Inverser une chaîne
  2. Inverser une phrase ("bob aime les chiens" -> "chiens aime bob")
  3. Trouvez la valeur minimale dans une liste
  4. Trouvez la valeur maximale dans une liste
  5. Calculer un reste (étant donné un numérateur et un dénominateur)
  6. Renvoie des valeurs distinctes à partir d'une liste comprenant des doublons (par exemple "1 3 5 3 7 3 1 1 5" -> "1 3 5 7")
  7. Renvoie des valeurs distinctes et leurs décomptes (c'est-à-dire que la liste ci-dessus devient "1 (3) 3 (3) 5 (2) 7 (1)")
  8. Étant donné une chaîne d'expressions (uniquement des variables, + et -) et un ensemble de paires variable / valeur (c'est-à-dire a = 1, b = 7, c = 3, d = 14) renvoie le résultat de l'expression ("a + b + c -d "serait -3).

Celles-ci étaient pour Java, et vous pouviez utiliser les bibliothèques standard afin que certaines d'entre elles puissent être extrêmement faciles (comme 6). Mais ils fonctionnent comme FizzBuzz. Si vous avez une idée de la programmation, vous devriez être capable de faire le plus rapidement. Même si vous ne connaissez pas bien la langue, vous devriez au moins être en mesure de donner une idée de la façon de faire quelque chose.

En utilisant ce test, l'un de mes anciens patrons a tout vu, des gens qui ont tout fait assez vite, aux gens qui pouvaient faire le plus assez rapidement, à un gars qui ne pouvait pas répondre à une seule après une demi-heure.

Je devrais également noter: il a laissé les gens utiliser son ordinateur pendant que ces tâches leur étaient confiées. Ils ont été spécifiquement informés qu'ils pouvaient utiliser Google et autres.


Pour le point 8, une solution basée sur JSR-223 (javax.script) serait-elle acceptée? :-P (Certes, l'utilisation de cela est complètement exagérée, mais certaines personnes préfèrent le faire plutôt que d'utiliser, par exemple, java.util.Scanner.)
Chris Jester-Young

4
Ce n'est pas dans mon idée de l'esprit de la question, mais si vous en savez assez pour proposer cela, alors vous en savez certainement assez pour passer les questions FizzBuzz, donc je ne vous en voudrai pas. Cela peut même être un plus en votre faveur. Je demanderais probablement encore comment vous le feriez sans javax.script.
MBCook

3
Je lis votre réponse depuis un moment et je ne pourrais pas comprendre ce qui se passait, pourquoi je n'ai pas aimé, le fait est que vos questions ne sont pas amusantes à coder :) (ce qui est bien puisque c'était prévu pour les entretiens). Il n'y a aucun intérêt à ce commentaire, mais je voulais juste le sortir de mon système. :) désolé pour tous les smileys
Trufa

1
Je voudrais voir des exemples de solutions pour le numéro 8. Les 7 premiers sont un jeu d'enfant, mais 8 (pour moi) me semble un peu plus compliqué que les autres. Je travaille dans Python 3.x et c'est un jeu complètement différent. Probablement quelque chose dont je ne suis pas au courant.
DonutSteve

31

Cela ne répond peut-être pas directement à votre question, mais je ne suis pas certain que vous ayez besoin de poser un autre problème. En plus d'être "facile à mémoriser", la question FizzBuzz est tout simplement "facile", et c'est le point. Si la personne que vous interviewez fait partie de la classe de personnes pour laquelle FizzBuzz est "bien connu", alors elle appartient à la classe de personnes qu'une question de type FizzBuzz ne filtrerait pas. Cela ne signifie pas que vous les embauchez sur place, mais cela signifie qu'ils devraient être en mesure de passer au travers et de passer à l'essentiel de l'entrevue.

Pour le dire autrement, quiconque prend le temps de lire Coding Horror vaut la peine d'être interviewé plus loin. Demandez-leur simplement d'écrire la solution très rapidement, discutez-en brièvement (par exemple, comment testez-vous cela?), Puis passez à la question suivante. Et comme le dit l'article, "il est vraiment étonnant de voir combien de candidats sont incapables d'effectuer les tâches de programmation les plus simples."


7
Très bonne réponse. "FizzBuzz est facile et c'est le but ... quiconque prend le temps de lire Coding Horror vaut la peine d'être interviewé plus loin" QFT. Je demande souvent aux candidats "où allez-vous lire sur la programmation?" Je suis toujours surpris du nombre de personnes qui ne peuvent pas mentionner un seul blog, site Web ou livre.
Noah Sussman

1
Je ne suis pas d'accord. Nous avons interviewé quelqu'un la semaine dernière, et nous leur avons demandé le numéro 3 de la réponse acceptée. Ils ont littéralement dit "oh, je m'attendais à du fizzbuzz" et n'ont pas été en mesure de répondre à notre question.
frandroid

23

N'importe lequel des premiers du projet Euler serait probablement bon.

Par exemple:

Problème 25

La séquence de Fibonacci est définie par la relation de récurrence:

Fn = Fn−1 + Fn−2, where F1 = 1 and F2 = 1.

Par conséquent, les 12 premiers termes seront:

F1 = 1
F2 = 1
F3 = 2
F4 = 3
F5 = 5
F6 = 8
F7 = 13
F8 = 21
F9 = 34
F10 = 55
F11 = 89
F12 = 144

Le 12e terme, F12, est le premier terme à contenir trois chiffres.

Quel est l'index du premier terme de la séquence de Fibonacci à contenir 1000 chiffres?


14

J'ai trouvé que vérifier une chaîne s'il s'agit d'un palindrome est assez simple qui peut être une désherbeuse décente.


Je dirais que cela dépend de la langue. En C ça pourrait être intéressant, en Perl c'est fini avec scalar(reverse 'foo') == 'foo'.
jkramer le

3
c'est vrai, mais en même temps, être en mesure de voir la solution la plus simple est précieux ... alors vous dites, "ok, maintenant, faites comme si vous n'avez pas la fonction inverse."
Mike Stone du

1
En C ++, je donnerais des points bonus pour toutes les solutions "fonctionnelles" qui n'impliquent pas de boucle manuscrite. par exemple, "return equal (str.begin (), str.end (), str.rbegin ());" ou (pour les fous de vitesse) "return equal (str.begin (), str.begin () + str.size () / 2, str.rbegin ());"
Chris Jester-Young

1
Bien sûr, en voyant une telle réponse, je demanderais également au candidat d'expliquer le fonctionnement du code. Ils ne peuvent pas avoir une longueur d'avance simplement en copiant ma réponse ci-dessus! :-P
Chris Jester-Young

10

Je voulais une question FizzBuzz qui n'implique pas l'opérateur modulo. D'autant plus que j'interroge généralement des développeurs Web pour lesquels l'opérateur modulo ne revient pas si souvent. Et si ce n'est pas quelque chose que vous rencontrez régulièrement, c'est l'une de ces choses que vous recherchez les rares fois où vous en avez besoin.

(Certes, c'est un concept que, idéalement, vous auriez dû rencontrer dans un cours de mathématiques quelque part en cours de route, mais c'est un sujet différent.)

Donc, ce que j'ai trouvé est ce que j'appelle, sans imagination, Threes in Reverse . L'instruction est:

Écrivez un programme qui imprime, dans l'ordre inverse , tous les multiples de 3 entre 1 et 200.

Le faire dans l'ordre normal c'est facile: multipliez l'indice de boucle par 3 jusqu'à ce que vous atteigniez un nombre qui dépasse 200, puis quittez. Vous n'avez pas à vous soucier du nombre d'itérations à terminer après, vous continuez jusqu'à ce que vous atteigniez la première valeur trop élevée.

Mais pour revenir en arrière, il faut savoir par où commencer. Certains pourraient réaliser intuitivement que 198 (3 * 66) est le multiple le plus élevé de 3 et, en tant que tel, coder en dur 66 dans la boucle. D'autres pourraient utiliser une opération mathématique (division entière ou plancher () sur une division en virgule flottante de 200 et 3) pour déterminer ce nombre et, ce faisant, fournir quelque chose de plus applicable de manière générique.

Essentiellement, c'est le même genre de problème que FizzBuzz (faire une boucle sur les valeurs et les imprimer, avec une torsion). Celui-ci est un problème à résoudre qui n'utilise rien d'aussi (relativement) ésotérique que l'opération modulo.


2
Je suis curieux de Legion: comment vos développeurs Web font-ils des choses telles que l'interdiction verte / l'alternance de lignes sans modulo?
Andrew Burns

4
Eh bien, si vous essayez simplement d'appliquer des styles à des lignes alternées, en utilisant le sélecteur nième enfant de CSS3. jQuery a également des sélecteurs alternatifs pour faire de telles choses via JS. Mais pour parler de votre point plus large, comme je l'ai dit ci-dessus, c'est quelque chose qui est recherché, utilisé, puis rapidement oublié car il a fallu 15 secondes pour le trouver. Je ne dis pas que je l'aime ou l'approuve, mais surtout au niveau d'entrée, ça arrive. :)
Legion

1
voici ma solution php :) ideone.com/BnJQ3 3 minutes :)
Trufa

Cela doit être plus difficile dans les langages de bas niveau, car dans Ruby, c'est aussi simple que de pousser les nombres (dans l'ordre) dans un tableau, puis d'inverser le tableau entier. ideone.com/MKKb6
Kerrick

Python:print [x for x in xrange(3, 200, 3)][::-1]
beatgammit

8

Fibonacci, inverser une chaîne, compter le nombre de bits définis dans un octet sont d'autres courants. Project Euler a également une grande collection de difficultés croissantes.


Fibonaaci, bien qu'un peu plus avancé, est un bon choix, je suis un débutant complet et cela m'a pris 20-25 minutes, donc il y a votre référence :)
Trufa

J'ai été frappé avec Fibonacci, FizzBuzz et supprimer les entiers en double dans un tableau - le tout aujourd'hui dans une interview (4 heures)
IAbstract

8

Pour quelque chose de vraiment super simple qui peut être fait en 10 secondes, mais supprimerait les personnes qui ne peuvent pas littéralement programme quoi que ce soit , essayez celui - ci:

Demandez: montrez-moi (sur papier, mais mieux sur un tableau blanc) comment vous permuteriez les valeurs de deux variables.

Ce n'était pas mon idée, mais a été publiée dans un commentaire de quelqu'un nommé Jacob sur un article de blog consacré à la question originale de FizzBuzz.

Jacob poursuit en disant:

S'ils ne commencent pas par créer une troisième variable, vous pouvez pratiquement l'écarter. J'ai constaté que je pouvais réduire d'un tiers à la moitié de mes candidats (certes à ce stade non sélectionnés) avec cette seule question.

Il y a une autre discussion intéressante après ce commentaire sur le billet de blog original sur les moyens d'effectuer cette permutation de variables sans nécessiter une troisième variable (ajouter / soustraire, xor etc.), et bien sûr, si vous utilisez un langage qui prend en charge cela dans une seule instruction / opération, ce n'est peut-être pas un si bon test.

Bien que ce ne soit pas mon idée, je voulais publier ceci ici car c'est une question si simple et élégante à laquelle une personne qui a écrit même le plus simple des programmes peut (et devrait) répondre en 10 secondes environ. Il ne nécessite pas non plus l'utilisation d'opérateurs quelque peu apparemment obscurs comme l'opérateur modulo, que beaucoup de gens, qui sont par ailleurs des programmeurs assez décents, ne sont tout simplement pas familiers (ce que je connais de ma propre expérience).


1
Je pense que c'est une très bonne idée. Il vaut certainement mieux rester assis pendant 20 minutes à regarder pendant qu'un candidat débogue péniblement un programme en se demandant pourquoi il a utilisé foreach au lieu de for et comment y remédier! (Comme je viens de le faire)
Mike Nelson

std :: swap (a, b); Pourquoi devrais- je créer une troisième variable alors que presque toutes les bibliothèques standard le feront volontiers pour moi?

@Dan - L'idée est que l'on vous demande de le faire sans utiliser de bibliothèques et en utilisant uniquement les mots-clés intégrés dans la langue de votre choix. Bien sûr, dans le monde réel, vous pouvez utiliser une routine de bibliothèque pour y parvenir, comme si vous utilisiez une routine de bibliothèque pour (par exemple) une structure de liste chaînée plutôt que d'écrire la vôtre. L'intérêt de ce test est qu'il est suffisamment simple et pas hors de question d'attendre d' un candidat qu'il puisse le faire sans avoir besoin de recourir à une bibliothèque pour y parvenir.
CraigTP

Alors Jacob suggère-t-il à l'interviewé d'utiliser une troisième variable ou non? J'ai vu des alternatives à cette question où il demande au développeur de ne pas utiliser une troisième variable. La façon dont il a formulé sa réponse est assez ambiguë.
theGreenCabbage

1
En tant que personne qui pense être juste un programmeur "d'accord", cela m'a fait peur. Ma pensée immédiate a été "Cher Dieu, j'utiliserais une troisième variable, mais il veut sûrement une façon intelligente de le faire sans une!"
Devil's Advocate

4

Demandez-leur d'écrire une application pour renvoyer les facteurs d'un nombre donné. C'est facile à faire et difficile à bien faire en peu de temps. Vous pouvez voir leur style et la façon dont ils réfléchissent aux problèmes en peu de temps.


2

Renvoie l'index de la première occurrence de la chaîne X dans la chaîne Y

La mise en œuvre de strstr () nécessite une compréhension de base du langage tout en offrant la possibilité d'une optimisation intelligente.


2

S'il s'agit d'une interview C / C ++, assurez-vous que la personne connaît les pointeurs.

Général - algorithme simple (liste chaînée [simple / double]). Renseignez-vous sur la complexité de l'ajout dans chaque cas (au début, à la fin, les optimisations ...)?

(Général) Comment trouvez-vous min et max à partir d'un tableau (taille N) avec seulement 3 * N / 2 comparaisons?

C / C ++: Comment optimiseriez-vous plusieurs "strcat" dans un tampon?


Il me semble que pour le problème "Comment trouvez-vous min et max à partir d'un tableau (taille N) avec seulement 3 * N / 2 comparaisons?" il est bon de préciser que le nombre 3 * N / 2 est un nombre de comparaison d'éléments de tableau, mais vous pouvez comparer librement int par exemple. par exemple (i <taille du tableau) en boucles.
sergtk


0

Que diriez-vous: je souhaite utiliser un seul entier pour stocker plusieurs valeurs. Décrivez comment cela fonctionnerait.

S'ils n'ont pas la moindre idée des masques de bits et des opérations, ils ne peuvent probablement pas résoudre d'autres problèmes.


9
Je dirais que c'est plus instructif si, après avoir expliqué ou souligné des masques, si la personne ne se claque pas le front et secoue la tête par auto-dérision. Les masques de bits ne sont pas un idiome courant, à moins que l'on ne fasse du C, des périphériques intégrés ou du réseau. Beaucoup de gens talentueux ne l'ont pas fait.
Gregg Lind

2
Hmm, alors vous devez décider si accepter le stockage de 1,2 et 3 en décimal 123 compte comme une réponse correcte, même si le calcul serait très compliqué par rapport à la simple déclaration de 3 variables. Ou stocker 1,2,3 en écrivant x = 1; x = 2; x = 3; Je veux dire, devons-nous stocker ces valeurs en même temps?
MatthewMartin

0

Trouver une liste de nombres premiers est une question assez courante, mais elle nécessite encore une réflexion et les réponses que les gens peuvent donner à divers degrés.

Vous seriez également surpris du nombre de personnes qui ont du mal à implémenter une structure de données de type Map / Dictionary.


0

J'ai demandé à mes candidats de créer un programme de calcul factoriel d'un nombre donné dans n'importe quelle pseudo-langue de leur choix. C'est un problème assez facile à résoudre et il se prête bien aux questions de suivi naturel (qui pourraient souvent être posées) sur la récursivité.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.