CommunityEscrita e Ediçãogithub.com

chrisis58/revisão-leetcode-skill

Skill de agente para revisar suas submissões do LeetCode como um coach.

O que é revisão-leetcode-skill?

Esta skill de agente de IA (compatível com Claude Code, Cursor e Codex) atua como um coach de programação para revisar soluções de algoritmos do LeetCode. Ela não entrega a resposta pronta, mas sim orienta o usuário a dar o próximo passo, identificando seu nível atual (do brute force até otimizações de especialista) e sugerindo uma única meta de evolução por vez. A skill coleta automaticamente o ID do problema, o código do usuário e a linguagem de programação (detecta C++, Java, Python, Go, Rust e JavaScript), busca metadados do problema via script interno e realiza uma revisão algorítmica geral (complexidade de tempo/espaço, casos de borda, legibilidade) mais verificações específicas por linguagem. O feedback é estruturado em uma pontuação de 0 a 10, uma dica acionável (sem código completo, no modo coaching) e uma extensão ou incentivo personalizado para o nível do usuário. A skill suporta adaptação de idioma (inglês, chinês e outros) e prioriza orientações sobre complexidade e eficiência, deixando questões de estilo ou debug para segundo plano.

Funciona com~Claude Code~Codex CLI~Cursor
npx skills add chrisis58/leetcode-review-skill

Installed? Explore more Escrita e Edição skills: steipete/notion, langchain-ai/langchain, bytedance/podcast-generation · View all 6 →

Perguntar na sua IA favorita

Abre um novo chat com esta habilidade de agente já pré-carregada.

Documentação

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

EntradaFontePrioridade
problem_idMensagem do usuário (obrigatório)Extrair ID ou slug
user_codeContexto disponívelVerificar na ordem: código selecionado → arquivo aberto → colagem do usuário
languageDetecção automáticaInferir 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ãoCandidatos
vector<int>, std::, unordered_mapcpp
class Solution { public: (sem STL)java
def solution(self,, List[int]python
func Solution(, []intgo
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ívelCaracterísticas
Nível 1Força bruta: loops aninhados, sem consciência de otimização
Nível 2Algoritmos básicos: usa estruturas de dados padrão, complexidade de tempo aceitável
Nível 3Complexidade ótima: melhor tempo/espaço, mas com fatores constantes maiores
Nível 4Especialista: 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.

  1. Liste os guias de linguagem disponíveis:

    ls languages/*.md
    
  2. A partir dos padrões de código, infira nomes de linguagens candidatas (ex: "cpp", "java")

  3. Tente ler o arquivo correspondente:

    Read languages/<candidato>.md
    
  4. Se a leitura for bem-sucedida: Use como uma lista de verificação para garantir que você cobriu ângulos relevantes.

  5. 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:

  1. Alta prioridade: Problemas de complexidade de tempo/espaço, ineficiência algorítmica
  2. Média prioridade: Armadilhas de desempenho específicas da linguagem
  3. 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árioCabeçalhos das Seções
Chinês当前基线与进阶目标, 综合得分, 破局指南, 延伸追问
InglêsCurrent Baseline & Stretch Goal, Score, Hint, Extension
Misto/DesconhecidoUse 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)

Habilidades Relacionadas