Quels sont les problèmes simples liés à l’algorithme ou à la structure des données que vous rencontrez lors du processus de sélection des candidats?
J’ai quelques exemples simples que je peux utiliser pour valider des compétences en résolution de problèmes et qui peuvent être exprimés simplement, mais qui peuvent être appliqués à certaines heuristiques.
L’une des bases que j’utilise pour les développeurs juniors est la suivante:
Écrivez une méthode C # qui prend une chaîne qui contient un ensemble de mots (une phrase) et fait pivoter ces mots X nombre de places vers la droite. Lorsqu’un mot dans la dernière position de la phrase est tourné, il devrait apparaître à l’avant de la chaîne résultante.
- Lissage des valeurs au fil du temps: moyenne mobile ou quelque chose de mieux?
- Est-ce que la complexité temporelle de l’algorithme vide O (0)?
- Trouver le nombre de chiffres d’un entier
- Algorithmes de génération de mots de passe mémorisables sur le plan phonétique
- Pourquoi la taille 127 (prime) est-elle supérieure à 128 pour une table de hachage?
Quand un candidat répond à cette question, je cherche à savoir s’il existe des structures de données et des méthodes .NET (ssortingng.Join, ssortingng.Split, List, etc.) pour résoudre le problème. Je les recherche également pour identifier des cas particuliers d’optimisation. Comme le nombre de fois où les mots doivent être pivotés, ce n’est pas vraiment X, c’est X% du nombre de mots.
Quels sont les problèmes de tableau blanc que vous utilisez pour interroger un candidat et quelles sont certaines des choses que vous recherchez dans une réponse (vous n’avez pas besoin de poster la réponse réelle).
J’apprécie le classique “Quelle est la différence entre une LinkedList et une ArrayList (ou entre une liste liée et un tableau / vecteur) et pourquoi choisiriez-vous l’une ou l’autre?”
Le type de réponse que j’espère est celui qui comprend la discussion de:
Une fois quand j’interviewais pour Microsoft au collège, le gars m’a demandé comment détecter un cycle dans une liste chaînée.
Après avoir discuté en classe la semaine précédente de la solution optimale au problème, j’ai commencé à lui dire.
Il m’a dit: “Non, non, tout le monde me donne cette solution. Donnez-moi une autre solution.”
J’ai soutenu que ma solution était optimale. Il a dit: “Je sais que c’est optimal. Donnez-moi un sous-optimal.”
En même temps, c’est un très bon problème.
Lors d’interviews récentes, on m’a souvent demandé d’implémenter une structure de données, généralement LinkedList ou HashMap. Les deux sont assez faciles à faire en peu de temps et assez difficiles à éliminer.
Cela ne concerne pas nécessairement les capacités de la POO, mais lors de notre dernière série d’entretiens, nous avons utilisé une sélection de codes de bug de la liste Bug of the Month . Regarder les candidats trouver les bugs montre leurs capacités d’parsing, montre le savoir interpréter le code de quelqu’un
Les graphes sont difficiles, car la plupart des problèmes de graphismes non sortingviaux ont tendance à exiger une quantité décente de code à implémenter, si plus qu’une esquisse d’algorithme est requirejse. Une grande partie a tendance à se résumer à savoir si le candidat connaît ou non le chemin le plus court et les algorithmes de parcours graphique, s’il est familiarisé avec les types de cycles et la détection, et s’il connaît les limites de complexité. Je pense que beaucoup de questions sur ce sujet se résument à des questions plus que sur la capacité de reflection créative sur le terrain.
Je pense que les problèmes liés aux arbres ont tendance à couvrir la plupart des difficultés des questions sur les graphiques, mais sans la complexité du code.
J’aime le problème du projet Euler qui demande de trouver le chemin le plus cher dans un arbre (16/67); ancêtre commun est un bon échauffement, mais beaucoup de gens l’ont vu. Demander à quelqu’un de concevoir une classe d’arborescence, d’effectuer des parcours et de déterminer à partir de quelles traversées ils pourraient reconstruire une arborescence donne également un aperçu de la structure des données et de l’implémentation des algorithmes. Le défi de la programmation Stern-Brocot est également intéressant et rapide à développer sur un tableau ( http://online-judge.uva.es/p/v100/10077.html ).
J’aime revoir un code que la personne a réellement écrit et leur demander de m’expliquer.
Suivez toute question comme celle-ci avec: “Comment pourriez-vous améliorer ce code pour que le développeur qui le gère puisse comprendre comment cela fonctionne facilement?”
Implémenter une fonction qui, étant donné une liste liée qui peut être circulaire, permute les deux premiers éléments, le troisième avec le quasortingème, etc.
Une chose sortingviale est de leur demander de coder une recherche complète d’un arbre à partir de zéro. Oui, si vous savez ce que vous faites, c’est sortingvial. Mais beaucoup de programmeurs ne savent pas comment s’y prendre.
Celui que je trouve plus utile encore est le suivant. Je l’ai donné dans un certain nombre de langues, voici une version Perl. Je leur donne d’abord l’exemple de code suivant:
# @a and @b are two arrays which are already populated. my @int; OUTER: for my $x (@a) { for my $y (@b) { if ($x eq $y) { push @int, $x; next OUTER; } } }
Ensuite, je leur pose les questions suivantes. Je leur demande lentement, donne aux gens le temps de réfléchir et je suis prêt à leur donner un coup de pouce:
S’ils présentent une solution légèrement (ou très) erronée, le jeu de données idiot suivant trouvera la plupart des erreurs rencontrées:
@a = qw( hello world hello goodbye earthlings ); @b = qw( earthlings say hello earthlings );
J’imagine qu’environ 2/3 des candidats échouent à cette question. Je n’ai pas encore rencontré un programmeur compétent qui avait des problèmes avec lui. J’ai constaté que les personnes ayant un bon sens commun et peu de connaissances en programmation réussissent mieux que les programmeurs ordinaires ayant quelques années d’expérience.
Je suggère d’utiliser ces questions comme filtres. N’embauchez pas quelqu’un parce qu’il peut y répondre. Mais s’ils ne peuvent pas répondre à ces questions, ne les engagez pas.
En leur demandant d’écrire un algorithme récursif pour une solution itérative bien connue (par exemple, Fibonacci, etc., nous leur donnons une fonction itérative si nécessaire) et leur demandons ensuite de calculer le temps d’exécution.
La fonction récursive implique souvent une structure de données arborescente. Le nombre de fois que la personne n’a pas reconnu ce qui me déconcerte. Il devient légèrement difficile de calculer le temps d’exécution jusqu’à ce que vous puissiez voir que c’est une structure en arbre …
Je trouve que ce problème couvre de nombreux domaines. A savoir, leur capacité de lecture de code (si on leur atsortingbue une fonction itérative), leur capacité d’écriture de code (puisqu’ils écrivent une fonction récursive), leur algorithme, leur structure de données (pour l’exécution) …