Retour à l'accueil

Patrons Two Pointers HashMap Stack pour les entretiens

L'article décompose les patrons Two Pointers, HashMap et Stack avec des exemples de code JavaScript. Chaque patron est illustré avec un problème, un algorithme et une liste de vérification d'application. Convient à la préparation aux entretiens techniques.

3 patrons pour 60 % des problèmes à l'entretien JS
Advertisement 728x90

Trois Patrons Essentiels pour les Algorithmes en Entretien de Code

Le patron Deux Pointeurs utilise deux pointeurs pour balayer les données en un seul passage. Il réduit la complexité de O(n²) à O(n) pour les palindromes, les paires d'éléments et les tâches de filtrage.

Deux variantes principales :

  • Gauche-Droite (convergeant) : gauche commence à l'index 0, droite à s.length - 1. Les déplacer vers le centre pour vérifier la symétrie.
  • Lent-Rapide : lent met à jour le résultat, rapide avance pour supprimer les doublons ou décaler les éléments.

Exemple : vérification d'un palindrome en ignorant les caractères non alphabétiques.

Google AdInline article slot
const isPalindrome = (s) => {
  let left = 0;
  let right = s.length - 1;

  while (left < right) {
    if (s[left] !== s[right]) {
      return false;
    }
    left++;
    right--;
  }

  return true;
};

console.log(isPalindrome("madam")); // true
console.log(isPalindrome("abc")); // false

HashMap : Recherches Rapides et Regroupement

HashMap (objet ou Map) stocke des paires clé-valeur pour un accès en O(1). Idéal pour les comptages de fréquences, vérifications d'unicité, anagrammes et mise en cache.

Algorithme : un passage pour construire, un second pour interroger. Évite complètement les boucles imbriquées.

Exemple : premier caractère unique dans une chaîne.

Google AdInline article slot
const firstUniqueChar = (s) => {
  const map = {};

  for (const char of s) {
    map[char] = (map[char] || 0) + 1;
  }

  for (const char of s) {
    if (map[char] === 1) {
      return char;
    }
  }

  return null;
};

console.log(firstUniqueChar("banana")); // 'b'
console.log(firstUniqueChar("aabbc")); // 'c'

Pile : Gestion des Structures LIFO

La pile suit le principe Dernier Entré - Premier Sorti. Un tableau avec push/pop excelle pour la validation de parenthèses, les piles sans récursion et le backtracking.

Exemple : validation de séquences de parenthèses.

const isValidBrackets = (s) => {
  const stack = [];
  const map = {
    ')': '(',
    ']': '[',
    '}': '{' 
  };

  for (const char of s) {
    if ('([{'.includes(char)) {
      stack.push(char);
    } else {
      const last = stack.pop();
      if (last !== map[char]) {
        return false;
      }
    }
  }

  return stack.length === 0;
};

console.log(isValidBrackets("{[()()]}")); // true
console.log(isValidBrackets("{[(])}")); // false

Quand Utiliser Chaque Patron

Avant de coder, repérez ces indices :

Google AdInline article slot

Deux Pointeurs :

  • Tableau/chaîne avec symétrie (palindrome).
  • Recherche de paires d'éléments.
  • Tableau trié.
  • Comparaison depuis les deux extrémités.

HashMap :

  • Comptage de fréquences ou unicité.
  • Anagrammes, regroupement.
  • Vérification d'existence d'éléments.
  • Données non triées nécessitant des recherches rapides.

Pile :

  • Parentèses ou structures imbriquées.
  • Logique LIFO (dernier ouvert se ferme en premier).
  • Backtracking ou historique d'états.

Points Clés à Retenir

  • Deux Pointeurs économise les passages de données, parfait pour les structures linéaires.
  • HashMap offre un accès O(1), remplaçant les boucles imbriquées par deux passages.
  • Pile garantit l'ordre d'imbrication correct sans récursion.
  • Entraînez-vous : résolvez 10 problèmes par patron, puis mélangez-les.

Ces patrons résolvent la plupart des problèmes LeetCode/Codewars Facile/Moyen. Une pratique régulière forge l'intuition des entretiens seniors.

— Editorial Team

Advertisement 728x90

Lire ensuite