Coding Challenges Strategy

Estratégia para coding interviews — não é sobre memorizar soluções, é sobre reconhecer padrões.

Abordagem para coding interviews

Framework de resolução (durante a entrevista)

1. Entender o problema (2-3 min)

  • Repetir o problema com suas palavras
  • Clarificar inputs, outputs, constraints
  • Perguntar sobre edge cases: vazio? negativo? duplicatas? overflow?
  • Confirmar: “So I need to return X given Y, correct?”

2. Pensar em exemplos (2 min)

  • Trabalhar com exemplos concretos (small input)
  • Identificar o padrão antes de codar

3. Propor abordagem (3-5 min)

  • Começar com brute force: “The naive approach would be O(n²)…”
  • Otimizar: “But we can do better using a hash map for O(n)…”
  • Comunicar a complexidade de tempo E espaço

4. Codar (15-20 min)

  • Narrar enquanto escreve
  • Usar nomes de variáveis claros
  • Modularizar: extrair funções helper

5. Testar (5 min)

  • Dry-run com exemplo simples
  • Testar edge cases: vazio, um elemento, todos iguais
  • Verificar off-by-one errors

Os 15 padrões mais comuns

#PadrãoQuando usarComplexidade típica
1Two PointersArray ordenado, paresO(n)
2Sliding WindowSubarray/substring contíguaO(n)
3Fast & Slow PointersCiclo em lista, meio da listaO(n)
4Merge IntervalsIntervalos sobrepostosO(n log n)
5Binary SearchArray ordenado, buscaO(log n)
6BFSNível de árvore/grafo, caminho mais curtoO(V+E)
7DFSExploração completa, backtrackingO(V+E)
8HashMap/SetLookup O(1), contagem, dedupO(n)
9StackParsing, matching, monotonicO(n)
10Heap/Priority QueueTop-K, merge sortedO(n log k)
11Dynamic ProgrammingOtimização com subproblemasVaria
12BacktrackingCombinações, permutaçõesO(2ⁿ) ou O(n!)
13GreedyEscolha local ótimaO(n log n)
14TriePrefixos, autocompleteO(m) por operação
15Union-FindComponentes conectadosO(α(n))

Plano de estudo progressivo

Semana 1-2: Fundamentos

  • Two Pointers (5 problemas)
  • Sliding Window (5 problemas)
  • HashMap/Set (5 problemas)
  • Binary Search (5 problemas)

Semana 3-4: Árvores e Grafos

  • BFS (5 problemas)
  • DFS (5 problemas)
  • Heap/Priority Queue (5 problemas)
  • Stack (5 problemas)

Semana 5-6: Avançado

  • Dynamic Programming (10 problemas — Fibonacci, Knapsack, LCS, etc.)
  • Backtracking (5 problemas)
  • Greedy (5 problemas)
  • Merge Intervals (3 problemas)

Semana 7-8: Revisão e simulação

  • Revisar padrões fracos
  • Mock interviews (timed, 45 min)
  • Problemas mistos sem saber o padrão

Dicas específicas por linguagem

Java

// HashMap para contagem
Map<Character, Integer> freq = new HashMap<>();
for (char c : s.toCharArray()) {
    freq.merge(c, 1, Integer::sum);
}
 
// PriorityQueue (min-heap)
PriorityQueue<Integer> pq = new PriorityQueue<>();
 
// Sort com comparator
Arrays.sort(intervals, Comparator.comparingInt(a -> a[0]));
 
// StringBuilder (não concatenar strings em loop)
StringBuilder sb = new StringBuilder();

TypeScript/JavaScript

// Map para contagem
const freq = new Map<string, number>();
for (const c of s) {
  freq.set(c, (freq.get(c) ?? 0) + 1);
}
 
// Sort (cuidado: default é lexicográfico!)
nums.sort((a, b) => a - b);
 
// Set para dedup
const unique = [...new Set(arr)];
 
// Two pointers
let left = 0, right = arr.length - 1;
while (left < right) { ... }

Armadilhas comuns

  • Pular direto pro código: sem entender o problema e propor abordagem. O processo vale mais que a solução.
  • Silêncio: não falar enquanto pensa/coda. O entrevistador precisa ver seu raciocínio.
  • Otimizar prematuramente: comece com brute force, depois otimize. Mostra progressão de pensamento.
  • Não testar: após codar, sempre dry-run com um exemplo e checar edge cases.
  • Memorizar soluções: entrevistadores mudam detalhes. Entender o padrão é mais valioso.

Recursos

Veja também