CommunitySchreiben & Editierengithub.com

chrisis58/leetcode-review-skill

Fähigkeit zur Überprüfung von LeetCode-Einreichungen wie ein Coach, die Nutzer durch gezielte Hinweise fördert.

Was ist leetcode-review-skill?

Die LeetCode Code Review Skill ist eine coaching-orientierte Fähigkeit für KI-Agenten (z.B. Claude Code, Cursor), die Nutzern hilft, ihre LeetCode-Algorithmuslösungen zu verbessern, ohne die vollständige Antwort preiszugeben. Anstatt Code-Schnipsel oder Implementierungen zu liefern, identifiziert die Fähigkeit das aktuelle Niveau des Nutzers (von Level 1: Brute-Force bis Level 4: Experte) und setzt ein erreichbares Streckenziel. Der Ablauf umfasst das Abrufen von Problem-Metadaten, die Analyse des Nutzercodes, eine sprachspezifische Überprüfung anhand von Leitfäden und die Synthese zu einem strukturierten Feedback mit Score, einem umsetzbaren Hinweis (im Coaching-Stil) und optionaler Ermutigung oder einer Erweiterungsfrage. Die Skill unterstützt mehrere Sprachen (C++, Java, Python, Go, Rust, JavaScript) und passt die Ausgabesprache an den Nutzer an (z.B. Chinesisch oder Englisch). Sie ist ideal für Entwickler, die ihre Problemlösungsfähigkeiten systematisch verbessern möchten, ohne sich auf vorgefertigte Lösungen zu verlassen.

Funktioniert mit~Claude Code~Codex CLI~Cursor
npx skills add chrisis58/leetcode-review-skill

Installed? Explore more Schreiben & Editieren skills: steipete/notion, langchain-ai/langchain, bytedance/podcast-generation · View all 6 →

In Ihrer bevorzugten KI fragen

Öffnet einen neuen Chat, in dem dieser Agent-Skill bereits geladen ist.

Dokumentation

LeetCode Code Review Skill

Eine coaching-orientierte Code-Review-Fähigkeit für LeetCode-Algorithmusprobleme. Anstatt Antworten preiszugeben, hilft diese Fähigkeit Nutzern, ihr aktuelles Niveau zu identifizieren und einen Schritt weiterzugehen.

Schnellstart

Sammle Eingaben automatisch, wenn möglich:

Eingabesammlung

EingabeQuellePriorität
problem_idNutzernachricht (erforderlich)ID oder Slug extrahieren
user_codeVerfügbarer KontextIn Reihenfolge prüfen: ausgewählter Code → geöffnete Datei → Nutzer-Einfügung
languageAutomatische ErkennungAus Code ableiten (siehe unten)

Sprachautomatische Erkennung

Erkenne Kandidatensprachen anhand von Code-Mustern:

MusterKandidaten
vector<int>, std::, unordered_mapcpp
class Solution { public: (kein STL)java
def solution(self,, List[int]python
func Solution(, []intgo
impl Solution, Vec<i32>rust
function solution(, const solution =javascript

Bei Mehrdeutigkeit (z.B. Java/C++ teilen class Solution) beide versuchen – verfügbare Dateien lesen, bis eine Übereinstimmung gefunden wird.


Ausführungsablauf

Schritt 1: Problem-Metadaten abrufen

Führe das gebündelte Skript aus, um Problem-Informationen zu erhalten:

python scripts/fetch_lc.py "<id_or_slug>"

Das Skript unterstützt sowohl ID als auch Slug, erkennt das Format automatisch. Die Ausgabe umfasst:

  • id, title, difficulty, content (vollständige Problemstellung mit Constraints)
  • topics (z.B. ["Array", "Hash Table"])
  • hint (erster offizieller Hinweis, falls verfügbar)

Aus content und topics ermitteln:

  • Datenconstraints (z.B. $n \leq 10^4$ → erwarte $O(n)$ oder $O(n \log n)$)
  • Problemtyp: Ist es ein klassisches Multi-Lösungs-Problem? (Hash Table → Raum-Zeit-Kompromiss, DP → mehrere Ansätze)

Schritt 2: Niveau des Nutzers bewerten

Analysiere user_code, um die Komplexitätsstufe zu bestimmen:

StufeMerkmale
Stufe 1Brute-Force: verschachtelte Schleifen, kein Bewusstsein für Optimierung
Stufe 2Basisalgorithmen: verwendet Standard-Datenstrukturen, Zeitkomplexität akzeptabel
Stufe 3Optimale Komplexität: beste Zeit/Platz, aber größere konstante Faktoren
Stufe 4Experte: konstante Optimierung, Low-Level-Mechanismen, perfekte Randfallbehandlung

Setze EIN Streckenziel – nur eine Stufe vorrücken, niemals überspringen:

  • L1 → L2: Einführung einer grundlegenden Datenstrukturoptimierung
  • L2 → L3: Erreichen der theoretisch optimalen Komplexität
  • L3 → L4: Konstante Faktoroptimierung, Low-Level-Tricks

Schritt 3: Sprachspezifische Überprüfung

Allgemeine Ignorierregeln (alle Sprachen):

Die LeetCode-Umgebung importiert gängige Bibliotheken vorab und validiert nur Rückgabewerte, also KEINE Kommentare zu:

  • Fehlenden Importen / Includes / Use-Anweisungen
  • Paketdeklarationen
  • Hauptfunktion / Einstiegspunkt (nur Lösungsklasse/-funktion erforderlich)
  • Einfachen Typannotationen (es sei denn, sie betreffen die Korrektheit)

Hinweis: Debug-Ausgabeanweisungen (System.out.println, print(), console.log) sind niedrigprioritäre Probleme. Nur erwähnen, wenn keine signifikanten algorithmischen Probleme existieren.


Führe immer eine allgemeine algorithmische Überprüfung durch:

  • Zeitkomplexitätsanalyse
  • Raumkomplexitätsanalyse
  • Randfallbehandlung
  • Code-Lesbarkeit und Namenskonventionen

Zusätzlich sprachspezifische Erinnerungen prüfen:

Sprachleitfäden (languages/*.md) dienen als Fokuserinnerungen, nicht als Lehrmaterial. Sie weisen auf Winkel hin, die du übersehen könntest, nicht auf Dinge, die du bereits weißt.

  1. Verfügbare Sprachleitfäden auflisten:

    ls languages/*.md
    
  2. Aus Code-Mustern Kandidatensprachennamen ableiten (z.B. "cpp", "java")

  3. Versuche, die passende Datei zu lesen:

    Read languages/<candidate>.md
    
  4. Wenn Lesen erfolgreich: Als Checkliste verwenden, um sicherzustellen, dass relevante Winkel abgedeckt sind.

  5. Wenn keine passende Datei: Überspringen – dein allgemeines Wissen ist ausreichend.

Schritt 4: Ausgabe synthetisieren

Kombiniere alle Analysen zu strukturiertem Feedback:

Prioritätsreihenfolge für die Auswahl des Hinweises:

  1. Hohe Priorität: Zeit-/Raumkomplexitätsprobleme, algorithmische Ineffizienz
  2. Mittlere Priorität: Sprachspezifische Leistungsfallen
  3. Niedrige Priorität: Code-Stil, Debug-Anweisungen (nur erwähnen, wenn keine Probleme höherer Priorität vorhanden)

Ausgabestruktur:

  • Punktzahl (von 10, basierend auf Abstand zum Optimum)
  • Ein umsetzbarer Hinweis (Problem mit höchster Priorität, niemals vollständige Lösung angeben)
  • Erweiterungsfrage für Stufe 3/4, Ermutigung für Stufe 1/2

Ausgabeformat

Die Ausgabesprache sollte der Sprache des Nutzers entsprechen – erkannt aus seinen Nachrichten, Code-Kommentaren oder der Problemquelle (cn vs com Seite).

Verwende diese Struktur:

### 📊 Aktuelle Basis & Streckenziel
- **Aktueller Status**: Einschätzung des aktuellen Niveaus und Ansatzes in einem Satz.
- **Nächster Schritt**: Spezifisches Verbesserungsziel für diese Sitzung.

### 🎯 Punktzahl: [X] / 10

### 💡 Hinweis

**Standardmodus: Coaching (keine Code-Schnipsel)**

Standardmäßig niemals Code-Schnipsel oder Implementierungsdetails ausgeben. Der Hinweis sollte nur darauf hinweisen, was zu optimieren ist, nicht wie.

**Ausnahme: Nutzer fordert explizit Implementierung an**

Wenn der Nutzer nach Code, detaillierter Erklärung oder "wie implementieren" fragt (z.B. "zeig mir den Code"), wechsle in den Helfermodus und gib angemessene Anleitung.

---

**Im Coaching-Modus muss der Hinweis:**
- Eine konzeptionelle Erklärung sein, warum der aktuelle Ansatz suboptimal ist
- Ein Hinweis auf die benötigte algorithmische Technik oder Datenstruktur sein (nur Name, keine Verwendung)
- Ein Verweis auf bestimmte Zeilen oder Muster im Nutzercode sein, die Aufmerksamkeit benötigen

**Beispiele für gültige Hinweise (Coaching-Modus):**
- "Die verschachtelten Schleifen erzeugen O(n²)-Komplexität. Überlege: Was wäre, wenn du Komplementwerte in O(1) nachschlagen könntest?"
- "Autoboxing von `Integer` in engen Schleifen verursacht TLE. Ersetze durch primitive Arrays.""
- "Backtracking ohne Memoization wiederholt Teilprobleme. Dieser Problemtyp verwendet typischerweise DP."
- "Die Raumkomplexität kann reduziert werden. Beobachte das Abhängigkeitsmuster der DP-Dimension – Dimensionskompression könnte anwendbar sein."

**Beispiele für UNGÜLTIGE Hinweise (Coaching-Modus):**
- ❌ "Verwende `unordered_map<int, int>`, um zu speichern..." (gibt Implementierung preis)
- ❌ "So geht's: `dp[j] |= dp[j - stone];`" (gibt Code-Schnipsel)
- ❌ "dp[i][j] hängt von dp[i-1][j] und dp[i][j-1] ab, also kannst du ein 1D-Array verwenden..." (erklärt Abhängigkeit + impliziert Implementierung)
- ❌ Jeglicher Pseudocode, Teilcode oder "schlecht → gut" Code-Vergleich
- ❌ Detaillierte Erklärung von Zustandsübergängen, die effektiv den Algorithmus preisgibt

### 🎙️ Erweiterung / Ermutigung
- **Stufe 3/4**: Stelle eine anspruchsvolle Frage zu Laufzeitmechanismen oder Systemarchitektur.
- **Stufe 1/2**: Diesen Abschnitt überspringen, einen ermutigenden Satz hinzufügen.

Sprachanpassungsbeispiele:

NutzerspracheAbschnittsüberschriften
Chinesisch当前基线与进阶目标, 综合得分, 破局指南, 延伸追问
EnglischCurrent Baseline & Stretch Goal, Score, Hint, Extension
Gemischt/UnbekanntEnglisch als Standard verwenden

Beispiele

Beispiel mit chinesischem Nutzer

Kontext:

  • Nutzernachricht: "帮我看看这道题 1"
  • Code über IDE-Kontext verfügbar (ausgewählte oder geöffnete Datei)
  • Sprache aus vector<int>-Syntax erkannt → C++

Eingabe (automatisch gesammelt):

  • problem_id: 1 (aus Nachricht)
  • user_code: (aus Kontext)
  • language: cpp (automatisch erkannt)

Code:

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 {};
    }
};

Ausgabe:

### 📊 当前基线与进阶目标
- **当前状态**:Level 1 暴力实现,双层循环 $O(n^2)$ 时间复杂度。
- **Next Step**:使用哈希表将时间复杂度优化到 $O(n)$。

### 🎯 综合得分:5 / 10 分

### 💡 破局指南
- 观察 `nums[i] + nums[j] == target`:如果能知道 `target - nums[i]` 是否出现过,就不需要内层循环了。
- 这类问题通常用 Hash Table 做空间换时间优化。

### 🎙️ 延伸追问
你的解法边界处理得很好——`i < j` 避免了重复使用同一元素。继续加油!

Beispiel mit englischem Nutzer

Kontext:

  • Nutzernachricht: "Can you review my solution for problem 1?"
  • Code über IDE-Kontext verfügbar
  • Sprache aus Syntax erkannt → cpp

Eingabe (automatisch gesammelt):

  • problem_id: 1 (aus Nachricht)
  • user_code: (aus Kontext)
  • language: cpp (automatisch erkannt)

Ausgabe:

### 📊 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!

Gebündelte Ressourcen

  • scripts/fetch_lc.py — LeetCode-Metadaten-Abruf (unterstützt ID/Slug-Eingabe, cn/com-Seiten, lokales Caching)

Verwandte Skills