Banque de questions de code pour entretien technique
Les problèmes de code qui reviennent sans cesse dans les entretiens d’ingénieur logiciel. Pour chacun : le pattern à reconnaître, l’approche expliquée simplement et la complexité à annoncer. Les recruteurs notent le raisonnement que vous exposez, pas seulement le code final — entraînez-vous à expliquer votre approche à voix haute.
Two Sum II (entrée triée)
FacilePlacez un pointeur à chaque extrémité du tableau trié. Si la somme est trop petite, avancez le pointeur de gauche ; si elle est trop grande, reculez celui de droite. Le tri garantit que vous ne sautez jamais une paire valide — c’est cet invariant que les recruteurs veulent vous entendre énoncer à voix haute.
Valid Anagram
FacileComptez la fréquence des caractères de la première chaîne, décrémentez en parcourant la seconde, et vérifiez que tous les compteurs reviennent à zéro. Évoquez la question de suivi avant qu’on vous la pose : pour tout l’Unicode, un tableau fixe de 26 cases ne suffit plus — utilisez une table de hachage.
Linked List Cycle
FacileAvancez un pointeur d’un nœud et un autre de deux ; s’ils se rencontrent, il y a un cycle. Préparez-vous à la question de suivi classique — trouver l’entrée du cycle : remettez un pointeur en tête et avancez les deux d’un nœud à la fois jusqu’à ce qu’ils se rencontrent à nouveau.
Majority Element
FacileGardez un candidat et un compteur : incrémentez en cas de correspondance, décrémentez sinon, et remplacez le candidat quand le compteur tombe à zéro. Comme l’élément majoritaire apparaît plus de n/2 fois, il survit toujours. Expliquer POURQUOI il survit, c’est tout l’entretien.
Best Time to Buy and Sell Stock
FacileSuivez le prix minimum vu jusqu’ici et le meilleur bénéfice si vous vendez aujourd’hui. Un seul parcours, deux variables. C’est le plus petit exemple de l’idée « conserver le meilleur état du préfixe », que l’on retrouve ensuite dans l’algorithme de Kadane — faire ce lien rapporte des points.
Merge Intervals
MoyenTriez les intervalles par début, puis balayez : si l’intervalle courant commence après la fin du dernier intervalle fusionné, ajoutez-le ; sinon, étendez la fin fusionnée au maximum des deux. C’est le tri qui fait le vrai travail — dites-le, et traitez correctement les cas limites du comparateur (intervalles qui se touchent).
Longest Consecutive Sequence
MoyenMettez chaque nombre dans un ensemble ; ne commencez à compter qu’à partir des nombres dont le prédécesseur est absent (les débuts de séquence), puis avancez. Chaque élément est visité au plus deux fois : c’est ainsi que vous défendez le O(n) face à l’objection « mais il y a une boucle imbriquée ».
Product of Array Except Self
MoyenDeux passages sans division : remplissez d’abord chaque case avec le produit de tout ce qui se trouve à sa gauche, puis balayez depuis la droite en multipliant par le produit de tout ce qui se trouve à sa droite. Les réponses avec division échouent sur les zéros — les recruteurs l’interdisent généralement explicitement.
Min Stack
MoyenÀ côté de la pile des valeurs, gardez une pile des minimums dont le sommet est toujours le minimum de tout ce qui se trouve en dessous — empilez min(nouvelle valeur, sommet actuel), dépilez les deux en même temps. C’est une question de conception : c’est l’invariant, pas la quantité de code, qui est évalué.
LRU Cache
MoyenUne table de hachage donne un accès en O(1) aux nœuds d’une liste doublement chaînée triée du plus récemment au moins récemment utilisé ; déplacez un nœud en tête à chaque accès, évincez par la queue en cas de dépassement. Des nœuds sentinelles en tête et en queue suppriment tous les cas limites de pointeurs nuls — mentionnez-les avant de commencer à coder.
Number of Islands
MoyenParcourez la grille ; chaque case de terre non visitée lance un remplissage (DFS ou BFS) qui marque toute l’île comme visitée, et vous comptez ces départs. Annoncez votre stratégie de marquage (modifier la grille sur place ou utiliser un ensemble séparé) et le risque de profondeur de récursion sur de très grandes grilles — c’est le signal de séniorité.
Course Schedule
MoyenModélisez les prérequis comme un graphe orienté ; la question « peut-on tout terminer ? » revient exactement à « le graphe est-il acyclique ? ». L’algorithme de Kahn (retirer en boucle les nœuds de degré entrant nul) ou un DFS à trois couleurs fonctionnent tous les deux — choisissez-en un et expliquez pourquoi un nœud restant signifie un cycle.
Binary Tree Level Order Traversal
MoyenUn BFS avec une file, mais en relevant la longueur de la file à chaque tour pour produire une liste par niveau. Cette astuce de la longueur relevée est le cœur réutilisable : le parcours en zigzag et la vue de droite sont la même boucle avec une étape de collecte différente.
Validate Binary Search Tree
MoyenDescendez récursivement avec une fenêtre autorisée (min, max) qui se resserre à chaque étape — ou faites un parcours infixe et vérifiez qu’il est strictement croissant. Le piège classique consiste à ne comparer les enfants qu’à leur parent ; construisez vous-même le contre-exemple avant que le recruteur ne le fasse.
Word Pattern
FacileAssociez les caractères du motif aux mots ET les mots aux caractères — dans un seul sens, le motif "ab" serait accepté pour "dog dog". Vérifier la bijection dans les deux sens, c’est toute l’astuce ; prononcez le mot « bijection » et traitez le cas des longueurs différentes avant de coder.
Happy Number
FacileRemplacer sans cesse un nombre par la somme des carrés de ses chiffres finit soit par atteindre 1, soit par entrer dans une boucle — c’est donc Linked List Cycle déguisé. Détectez la boucle avec un ensemble des valeurs déjà vues, ou impressionnez avec les pointeurs lent/rapide de Floyd pour un espace en O(1). Nommer cette réduction à la détection de cycle, c’est le réflexe senior.
Gas Station
MoyenSi le total d’essence ≥ le coût total, une réponse existe et elle est unique. Balayez une seule fois en suivant le niveau courant du réservoir ; chaque fois qu’il devient négatif, aucune station de la portion ratée ne peut être le départ — repartez de la station suivante. L’entretien porte sur la justification de ce saut, pas sur la boucle elle-même.
Jump Game II
MoyenConsidérez les indices atteignables en k sauts comme un niveau de BFS : suivez le bord droit du niveau courant et la portée la plus lointaine observée ; quand vous dépassez le bord, incrémentez le nombre de sauts et étendez le bord jusqu’à cette portée maximale. Présenter cela comme un BFS sans file explique POURQUOI le glouton est optimal ici.
Insert Interval
MoyenÉmettez les intervalles qui se terminent avant le début du nouveau, puis absorbez dans le nouveau chaque intervalle qui le chevauche (début minimal, fin maximale), puis émettez le reste. L’entrée triée permet un seul passage sans nouveau tri — faites le parallèle avec Merge Intervals si l’on vous demande pourquoi c’est plus simple.
Rotate Image
MoyenPivoter de 90° dans le sens horaire = transposer, puis inverser chaque ligne. Deux passages propres avec un espace supplémentaire en O(1) valent mieux que de redériver sous pression l’échange cyclique à quatre éléments — mais préparez-vous à expliquer la correspondance des coordonnées (i,j) → (j, n−1−i) si le recruteur va au-delà de l’astuce.
Set Matrix Zeroes
MoyenUtilisez la première ligne et la première colonne pour stocker les indicateurs des lignes et colonnes à mettre à zéro, avec deux booléens qui retiennent leur propre état. Montez l’échelle de l’espace à voix haute — copie en O(mn) → ensembles en O(m+n) → stockage emprunté en O(1) — car c’est cette échelle elle-même qui est évaluée.
H-Index
MoyenTriez par ordre décroissant et trouvez le plus grand i tel que citations[i] ≥ i+1 — ou évitez le tri avec des seaux de comptage plafonnés à n, en O(n). Énoncez précisément la définition avant de coder ; la plupart des échecs sur ce problème viennent d’une mauvaise lecture de « h articles avec au moins h citations », pas de l’algorithme.
Course Schedule II
MoyenMême graphe que Course Schedule, mais cette fois l’algorithme de Kahn prend tout son sens : l’ordre dans lequel les nœuds de degré entrant nul sortent de la file EST un ordre de cours valide. Si l’ordre produit est plus court que le nombre de cours, il existe un cycle — renvoyez une liste vide. Mentionnez l’ordre postfixe d’un DFS, inversé, comme alternative.
Minimum Window Substring
DifficileÉtendez le bord droit jusqu’à ce que la fenêtre couvre tous les caractères requis (suivez un compteur « formés / requis », pas une comparaison complète de tables à chaque étape), puis contractez le bord gauche au minimum tant que la fenêtre reste valide, en notant la meilleure. C’est l’optimisation du compteur qui garantit le O(n) — expliquez-la clairement.
Trapping Rain Water
DifficileL’eau au-dessus de chaque barre vaut min(max-gauche, max-droite) − hauteur. Deux pointeurs qui avancent vers l’intérieur depuis les deux extrémités permettent de traiter le côté dont le maximum courant est le plus bas, car la borne de ce côté est déjà définitive. Expliquez pourquoi cette certitude tient — c’est toute la question.