Banco de perguntas de programação
Os problemas de programação de alta frequência que aparecem sem parar nas entrevistas de engenharia de software. Para cada um: o padrão a reconhecer, a abordagem em linguagem simples e a complexidade que você deve informar. Os entrevistadores avaliam o raciocínio que você narra, não só o código final — pratique dizer a abordagem em voz alta.
Two Sum II (entrada ordenada)
FácilComece com ponteiros nas duas pontas do array ordenado. Se a soma for pequena demais, avance o ponteiro da esquerda; se for grande demais, recue o da direita. A ordenação garante que você nunca pula um par válido — é essa invariante que os entrevistadores querem ouvir você dizer em voz alta.
Valid Anagram
FácilConte a frequência de cada caractere da primeira string, decremente enquanto percorre a segunda e confira se todas as contagens voltam a zero. Mencione o follow-up antes que perguntem: com Unicode completo, um array fixo de 26 posições não funciona mais — use um hash map.
Linked List Cycle
FácilAvance um ponteiro de um em um nó e outro de dois em dois; se eles se encontrarem, existe um ciclo. Esteja pronto para o follow-up clássico — encontrar a entrada do ciclo: volte um dos ponteiros para o início da lista e avance os dois de um em um até se encontrarem de novo.
Majority Element
FácilMantenha um candidato e um contador: incremente quando o elemento coincide, decremente quando não coincide e troque o candidato quando o contador chegar a zero. Como o elemento majoritário aparece mais de n/2 vezes, ele sempre sobrevive. Explicar POR QUE ele sobrevive é a entrevista.
Best Time to Buy and Sell Stock
FácilAcompanhe o menor preço visto até agora e o melhor lucro se você vendesse hoje. Uma varredura, duas variáveis. É a menor instância da ideia de “carregar o melhor estado do prefixo”, que aparece depois no algoritmo de Kadane — mencionar essa conexão vale pontos.
Merge Intervals
MédiaOrdene os intervalos pelo início e depois varra: se o intervalo atual começa depois que o último intervalo mesclado termina, adicione-o; caso contrário, estenda o fim do mesclado até o maior dos dois. A ordenação é que faz o trabalho de verdade — diga isso e acerte os casos-limite da comparação (intervalos que se tocam).
Longest Consecutive Sequence
MédiaColoque todos os números num conjunto; só comece a contar a partir dos números cujo antecessor não está no conjunto (inícios de sequência) e então avance. Cada elemento é visitado no máximo duas vezes, e é assim que você defende o O(n) contra a objeção “mas tem um loop aninhado”.
Product of Array Except Self
MédiaDuas passadas sem divisão: primeiro preencha cada posição com o produto de tudo o que está à esquerda dela, depois varra a partir da direita multiplicando pelo produto de tudo o que está à direita. Respostas com divisão falham nos casos com zero — os entrevistadores costumam proibi-la explicitamente.
Min Stack
MédiaAo lado da pilha de valores, mantenha uma pilha de mínimos cujo topo é sempre o mínimo de tudo o que está abaixo — empilhe min(novo, topo atual) e desempilhe as duas juntas. Esta é uma pergunta de design: o que está sendo avaliado é a invariante, não a quantidade de código.
LRU Cache
MédiaUm hash map dá acesso O(1) aos nós de uma lista duplamente encadeada ordenada por uso recente; mova um nó para o início quando ele for acessado e remova do fim quando a capacidade estourar. Nós sentinela no início e no fim eliminam todos os casos-limite de checagem de null — mencione-os antes de começar a programar.
Number of Islands
MédiaPercorra a grade; cada célula de terra não visitada inicia um flood fill (DFS ou BFS) que marca a ilha inteira como visitada, e você conta os inícios. Explique a sua estratégia de marcação (afundar a ilha no próprio lugar ou usar um conjunto separado) e o risco de profundidade de recursão em grades enormes — esse é o sinal de senioridade.
Course Schedule
MédiaModele os pré-requisitos como um grafo direcionado; a pergunta “dá para concluir?” é exatamente “o grafo é acíclico?”. O algoritmo de Kahn (remover repetidamente os nós com grau de entrada zero) ou a DFS com três cores funcionam — escolha um e explique por que um nó que sobra significa um ciclo.
Binary Tree Level Order Traversal
MédiaBFS com uma fila, mas guarde o tamanho da fila no início de cada rodada para emitir uma lista por nível. Esse truque de guardar o tamanho é o núcleo reutilizável — o percurso em zigue-zague e a visão do lado direito são o mesmo loop com outra forma de coletar.
Validate Binary Search Tree
MédiaFaça a recursão com uma janela permitida (mín., máx.) que se estreita a cada passo — ou faça um percurso em ordem e confira se ele é estritamente crescente. A armadilha clássica é comparar os filhos só com o pai; construa você mesmo o contraexemplo antes que o entrevistador faça isso.
Word Pattern
FácilMapeie os caracteres do padrão para as palavras E as palavras de volta para os caracteres — um sentido só aceita o padrão “ab” para “dog dog”. Conferir a bijeção nos dois sentidos é o truque inteiro; diga a palavra “bijeção” e trate o caso de tamanhos diferentes antes de programar.
Happy Number
FácilSubstituir repetidamente um número pela soma dos quadrados dos seus dígitos ou chega a 1 ou entra num loop — então este é o Linked List Cycle disfarçado. Detecte o loop com um conjunto dos números já vistos, ou impressione com os ponteiros lento e rápido de Floyd para ter espaço O(1). Nomear a redução para detecção de ciclo é a jogada de quem é sênior.
Gas Station
MédiaSe o combustível total ≥ o custo total, existe uma resposta e ela é única. Varra uma vez acompanhando o tanque acumulado; sempre que ele ficar negativo, nenhum posto do trecho que falhou pode ser o ponto de partida — recomece a partir do próximo posto. A entrevista é a justificativa desse salto, não o loop em si.
Jump Game II
MédiaTrate os índices alcançáveis com até k saltos como uma camada de BFS: acompanhe a borda direita da camada atual e o alcance mais distante visto; quando você passar da borda, incremente os saltos e estenda a borda até esse alcance mais distante. Enxergar isso como uma BFS sem fila explica POR QUE o guloso é ótimo aqui.
Insert Interval
MédiaEmita os intervalos que terminam antes de o novo começar, depois absorva no novo cada intervalo que se sobrepõe a ele (menor início, maior fim) e, por fim, emita o resto. Como a entrada já vem ordenada, basta uma passada sem reordenar — compare com Merge Intervals se perguntarem por que este é mais fácil.
Rotate Image
MédiaGirar 90° no sentido horário = transpor e depois inverter cada linha. Duas passadas limpas com espaço extra O(1) são melhores do que deduzir na mão a troca cíclica de quatro posições sob pressão — mas esteja pronto para explicar o mapeamento de coordenadas (i,j) → (j, n−1−i) se o entrevistador for além do truque.
Set Matrix Zeroes
MédiaUse a primeira linha e a primeira coluna para guardar as marcações de quais linhas e colunas devem ser zeradas, com dois booleanos lembrando o estado delas próprias. Percorra a escada de espaço em voz alta — cópia O(mn) → conjuntos O(m+n) → armazenamento emprestado O(1) —, porque a própria escada é o que está sendo testado.
H-Index
MédiaOrdene de forma decrescente e encontre o maior i em que citations[i] ≥ i+1 — ou dispense a ordenação com baldes de contagem limitados a n para ter O(n). Enuncie a definição com precisão antes de programar; a maioria das falhas neste problema vem de entender errado “h artigos com pelo menos h citações”, não do algoritmo.
Course Schedule II
MédiaO mesmo grafo do Course Schedule, mas agora o algoritmo de Kahn mostra o seu valor: a ordem em que os nós com grau de entrada zero saem da fila É uma ordem válida de disciplinas. Se a ordem emitida for menor do que o número de disciplinas, existe um ciclo — retorne vazio. Mencione a DFS em pós-ordem invertida como alternativa.
Minimum Window Substring
DifícilExpanda a borda direita até a janela cobrir todos os caracteres exigidos (acompanhe um contador de “formados versus exigidos”, em vez de comparar o mapa inteiro a cada passo), depois contraia a borda esquerda até o mínimo enquanto a janela continua válida, registrando a melhor. A otimização do contador de formados é o que mantém o O(n) — explique-a explicitamente.
Trapping Rain Water
DifícilA água acima de cada barra é min(máx. à esquerda, máx. à direita) − altura. Dois ponteiros que avançam das duas pontas para o meio permitem resolver o lado que tem o menor máximo acumulado, porque o limite desse lado já é definitivo. Explique por que essa certeza se sustenta — é a pergunta inteira.