Habilidade de Revisão de Código LeetCode
Uma habilidade de revisão de código com foco em coaching para problemas de algoritmo do LeetCode. Em vez de dar respostas prontas, esta habilidade ajuda os usuários a crescer, identificando seu nível atual e guiando-os um passo adiante.
Início Rápido
Colete entradas automaticamente quando possível:
Coleta de Entradas
| Entrada | Fonte | Prioridade |
|---|---|---|
problem_id | Mensagem do usuário (obrigatório) | Extrair ID ou slug |
user_code | Contexto disponível | Verificar na ordem: código selecionado → arquivo aberto → colagem do usuário |
language | Detecção automática | Inferir a partir do código (veja abaixo) |
Detecção Automática de Linguagem
Inferir linguagens candidatas a partir de padrões de código:
| Padrão | Candidatos |
|---|---|
vector<int>, std::, unordered_map | cpp |
class Solution { public: (sem STL) | java |
def solution(self,, List[int] | python |
func Solution(, []int | go |
impl Solution, Vec<i32> | rust |
function solution(, const solution = | javascript |
Se ambíguo (ex: Java/C++ compartilham class Solution), tente ambos — leia arquivos disponíveis até que um corresponda.
Fluxo de Execução
Passo 1: Buscar Metadados do Problema
Execute o script incluído para obter informações do problema:
python scripts/fetch_lc.py "<id_or_slug>"
O script suporta tanto ID quanto slug, detecta automaticamente o formato. A saída inclui:
id,title,difficulty,content(enunciado completo do problema com restrições)topics(ex: ["Array", "Hash Table"])hint(primeira dica oficial, se disponível)
A partir de content e topics, determine:
- Restrições de dados (ex: $n \leq 10^4$ → espere $O(n)$ ou $O(n \log n)$)
- Tipo de problema: É um problema clássico com múltiplas soluções? (Hash Table → trade-off espaço-tempo, PD → múltiplas abordagens)
Passo 2: Avaliar o Nível do Usuário
Analise user_code para determinar o nível de complexidade:
| Nível | Características |
|---|---|
| Nível 1 | Força bruta: loops aninhados, sem consciência de otimização |
| Nível 2 | Algoritmos básicos: usa estruturas de dados padrão, complexidade de tempo aceitável |
| Nível 3 | Complexidade ótima: melhor tempo/espaço, mas com fatores constantes maiores |
| Nível 4 | Especialista: otimização constante, mecanismos de baixo nível, tratamento de bordas perfeito |
Defina UMA meta de avanço — apenas avance um nível, nunca pule:
- L1 → L2: Introduzir otimização básica de estrutura de dados
- L2 → L3: Alcançar complexidade teórica ótima
- L3 → L4: Otimização de fator constante, truques de baixo nível
Passo 3: Revisão Específica por Linguagem
Regras de Ignorar Comuns (todas as linguagens):
O ambiente LeetCode pré-importa bibliotecas comuns e apenas valida valores de retorno, portanto, NÃO comente sobre:
- Importações / includes / use statements ausentes
- Declarações de pacote
- Função main / ponto de entrada (apenas classe/função solução necessária)
- Anotações de tipo simples (a menos que relacionadas à correção)
Nota: Instruções de saída de depuração (System.out.println, print(), console.log) são problemas de baixa prioridade. Mencione-as apenas quando não houver problemas algorítmicos significativos.
Sempre realize revisão algorítmica geral:
- Análise de complexidade de tempo
- Análise de complexidade de espaço
- Tratamento de casos de borda
- Legibilidade do código e convenções de nomenclatura
Além disso, verifique lembretes específicos da linguagem:
Guias de linguagem (languages/*.md) servem como lembretes de foco, não materiais de ensino. Eles apontam ângulos que você pode negligenciar, não coisas que você já sabe.
-
Liste os guias de linguagem disponíveis:
ls languages/*.md -
A partir dos padrões de código, infira nomes de linguagens candidatas (ex: "cpp", "java")
-
Tente ler o arquivo correspondente:
Read languages/<candidato>.md -
Se a leitura for bem-sucedida: Use como uma lista de verificação para garantir que você cobriu ângulos relevantes.
-
Se nenhum arquivo corresponder: Pule — seu conhecimento geral é suficiente.
Passo 4: Sintetizar Saída
Combine toda a análise em feedback estruturado:
Ordenação de prioridade para seleção de Dica:
- Alta prioridade: Problemas de complexidade de tempo/espaço, ineficiência algorítmica
- Média prioridade: Armadilhas de desempenho específicas da linguagem
- Baixa prioridade: Estilo de código, instruções de depuração (mencione apenas se não houver problemas de prioridade mais alta)
Estrutura de saída:
- Pontuação (de 0 a 10, baseada na distância para o ótimo)
- Uma dica acionável (problema de maior prioridade, nunca dê a solução completa)
- Pergunta de extensão para Nível 3/4, incentivo para Nível 1/2
Formato de Saída
O idioma da saída deve corresponder ao idioma do usuário — detecte a partir de suas mensagens, comentários de código ou origem do problema (site cn vs com).
Use esta estrutura:
### 📊 Linha de Base Atual & Meta de Avanço
- **Estado Atual**: Avaliação de uma frase do nível e abordagem atuais.
- **Próximo Passo**: Alvo de melhoria específico para esta sessão.
### 🎯 Pontuação: [X] / 10
### 💡 Dica
**Modo padrão: Coaching (sem trechos de código)**
Por padrão, nunca produza trechos de código ou detalhes de implementação. A Dica deve apenas apontar o que otimizar, não como.
**Exceção: Usuário solicita explicitamente implementação**
Se o usuário pedir código, explicação detalhada ou "como implementar" (ex: "mostre o código"), mude para o modo de ajuda e forneça a orientação apropriada.
---
**No modo coaching, a Dica deve ser:**
- Uma explicação conceitual de por que a abordagem atual é subótima
- Um ponteiro para a técnica algorítmica ou estrutura de dados necessária (apenas o nome, sem uso)
- Uma referência a linhas ou padrões específicos no código do usuário que precisam de atenção
**Exemplos de Dica válida (modo coaching):**
- "Os loops aninhados criam complexidade O(n²). Considere: e se você pudesse consultar valores complementares em O(1)?"
- "Autoboxing `Integer` em loops apertados causa TLE. Substitua por arrays primitivos."
- "Backtracking sem memoização repete subproblemas. Este tipo de problema normalmente usa PD."
- "A complexidade de espaço pode ser reduzida. Observe o padrão de dependência da dimensão da PD — a compressão de dimensão pode ser aplicada."
**Exemplos de Dica INVÁLIDA (modo coaching):**
- ❌ "Use `unordered_map<int, int>` para armazenar..." (fornece implementação)
- ❌ "Aqui está como: `dp[j] |= dp[j - stone];`" (fornece trecho de código)
- ❌ "dp[i][j] depende de dp[i-1][j] e dp[i][j-1], então você pode usar array 1D..." (explica dependência + implica implementação)
- ❌ Qualquer pseudo-código, código parcial, ou comparação "ruim → melhor"
- ❌ Explicação detalhada da transição de estado que efetivamente revela o algoritmo
### 🎙️ Extensão / Incentivo
- **Nível 3/4**: Faça uma pergunta desafiadora sobre mecanismos de tempo de execução ou arquitetura de sistema.
- **Nível 1/2**: Pule esta seção, adicione uma frase de incentivo.
Exemplos de adaptação de idioma:
| Idioma do Usuário | Cabeçalhos das Seções |
|---|---|
| Chinês | 当前基线与进阶目标, 综合得分, 破局指南, 延伸追问 |
| Inglês | Current Baseline & Stretch Goal, Score, Hint, Extension |
| Misto/Desconhecido | Use inglês como padrão |
Exemplos
Exemplo de Usuário Chinês
Contexto:
- Mensagem do usuário: "帮我看看这道题 1"
- Código disponível via contexto da IDE (arquivo selecionado ou aberto)
- Linguagem detectada a partir da sintaxe
vector<int>→ C++
Entrada (coletada automaticamente):
problem_id: 1 (da mensagem)user_code: (do contexto)language: cpp (detectado automaticamente)
Código:
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
for (int i = 0; i < nums.size(); i++) {
for (int j = i + 1; j < nums.size(); j++) {
if (nums[i] + nums[j] == target) return {i, j};
}
}
return {};
}
};
Saída:
### 📊 当前基线与进阶目标
- **当前状态**:Level 1 暴力实现,双层循环 $O(n^2)$ 时间复杂度。
- **Next Step**:使用哈希表将时间复杂度优化到 $O(n)$。
### 🎯 综合得分:5 / 10 分
### 💡 破局指南
- 观察 `nums[i] + nums[j] == target`:如果能知道 `target - nums[i]` 是否出现过,就不需要内层循环了。
- 这类问题通常用 Hash Table 做空间换时间优化。
### 🎙️ 延伸追问
你的解法边界处理得很好——`i < j` 避免了重复使用同一元素。继续加油!
Exemplo de Usuário Inglês
Contexto:
- Mensagem do usuário: "Can you review my solution for problem 1?"
- Código disponível via contexto da IDE
- Linguagem detectada a partir da sintaxe → cpp
Entrada (coletada automaticamente):
problem_id: 1 (da mensagem)user_code: (do contexto)language: cpp (detectado automaticamente)
Saída:
### 📊 Current Baseline & Stretch Goal
- **Current State**: Level 1 brute force, $O(n^2)$ nested loops.
- **Next Step**: Reduce to $O(n)$ using hash table.
### 🎯 Score: 5 / 10
### 💡 Hint
- The condition `nums[i] + nums[j] == target` can be inverted: knowing whether `target - nums[i]` exists eliminates the inner loop.
- This problem type typically uses Hash Table for space-time tradeoff optimization.
### 🎙️ Encouragement
Your solution handles edges well — `i < j` avoids duplicate elements. Keep practicing!
Recursos Incluídos
scripts/fetch_lc.py— Obtém metadados do LeetCode (suporta entrada ID/slug, sites cn/com, cache local)