java-python-code-reviewer について
アルゴリズム学習者やレビュアー向けの、Java と Python のコードレビュー用スキルです。正確性や計算量、コード品質を確認し、改善案を示します。
主な機能
- 01正確性と境界条件の確認
- 02時間・空間計算量の分析
- 03Java と Python の品質レビュー
- 04言語間の実装比較
- 05アルゴリズムの最適化案
活用シーン
- 01LeetCode 解法のレビュー
- 02Java と Python の方針比較
- 03境界条件やロジックの誤り発見
- 04性能改善点の特定
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ yennanliu/ cs_basics --skill java-python-code-reviewerインストール後、Claude Code で/java-python-code-reviewerを入力して読み込まれたか確認します。
詳細
Java & Python コードレビュアー
このスキルを使用するタイミング
次の場合にこのスキルを使用します:
- LeetCode の問題の解答をレビューするとき
- コードの正確性と効率性を確認するとき
- Java と Python の実装を比較するとき
- アルゴリズムの実装に関するフィードバックを提供するとき
- 既存の解決策を最適化するとき
レビューフレームワーク
1. 正確性の分析
確認項目:
- エッジケースの処理(空の入力、null、単一要素)
- 境界条件(配列のインデックス、ループの終了条件)
- アルゴリズムの実装におけるロジックエラー
- テストケースの網羅性(基本ケース、エッジケース、特殊ケース)
一般的なエッジケース:
- 空の配列/文字列:
[]、"" - null 入力:
null、None - 単一要素:
[1]、"a" - 重複要素:
[1,1,1] - 負の数:
[-1, -5] - 大きな入力:実行時間/メモリの制限をテスト
2. 時間計算量と空間計算量
分析および検証する項目:
- 時間計算量:入力サイズに対する操作回数を数えます
- 空間計算量:使用する補助領域を数えます
- 最適な解決策と比較します
提示内容:
Current: O(n²) time, O(1) space
Optimal: O(n) time, O(n) space using HashMap
Trade-off: Use extra space for better time complexity
計算量のリファレンス:
- O(1):直接アクセス
- O(log n):二分探索、平衡木
- O(n):1 回の走査、線形スキャン
- O(n log n):効率的なソート、分割統治法
- O(n²):ネストしたループ
- O(2ⁿ):指数時間(バックトラッキング、総当たり)
3. コード品質 - Java
Java のベストプラクティス:
- 適切なデータ構造を使用します(
ArrayList、HashMap、HashSet) - 命名規則に従います(メソッド/変数にはキャメルケースを使用)
- null チェックと入力検証を行います
- ジェネリクスを適切に使用します(raw 型ではなく
List<Integer>を使用) - 実装よりインターフェースを優先します(
ArrayList<>ではなくList<>を使用)
指摘すべき Java のアンチパターン:
// Bad: Raw types
ArrayList list = new ArrayList();
// Good: Generics
List<Integer> list = new ArrayList<>();
// Bad: Manual array copying
for (int i = 0; i < arr.length; i++) { ... }
// Good: Built-in methods
Arrays.copyOf(arr, arr.length);
// Bad: String concatenation in loop
String s = "";
for (String str : list) { s += str; }
// Good: StringBuilder
StringBuilder sb = new StringBuilder();
for (String str : list) { sb.append(str); }
確認項目:
- 整数のオーバーフロー:必要に応じて
longを提案します - 適切な例外処理
- メモリリーク(リソースの未クローズ)
- 該当する場合はスレッドセーフ性
4. コード品質 - Python
Python のベストプラクティス:
- Python らしい慣用表現を使用します(リスト内包表記、
enumerate、zip) - PEP 8 のスタイルガイドラインに従います
- 適切なデータ構造を使用します(
set、dict、deque) - 組み込み関数を活用します
指摘すべき Python のアンチパターン:
# Bad: Manual index tracking
for i in range(len(arr)):
print(i, arr[i])
# Good: enumerate
for i, val in enumerate(arr):
print(i, val)
# Bad: Building list with append in loop
result = []
for x in arr:
result.append(x * 2)
# Good: List comprehension
result = [x * 2 for x in arr]
# Bad: Multiple membership checks
if x == 'a' or x == 'b' or x == 'c':
# Good: Use set or tuple
if x in {'a', 'b', 'c'}:
確認項目:
- 適切なコレクションの使用(
collections.defaultdict、Counter) - メモリ効率を高めるジェネレーター式
Noneチェックの適切な使用- 明確さのための型ヒント(任意ですが有用です)
5. アルゴリズムの最適化
次のような改善を提案します:
- 不要なネストしたループ → HashMap を使って O(n) にします
- 繰り返しの計算 → メモ化/DP を使います
- 冗長なソート → ヒープまたはクイックセレクトを使います
- 複数回の走査 → 1 回の走査にまとめます
- 余分な領域の使用 → インプレースで変更します
パターンの認識:
- Two Sum パターン → HashMap を使います
- スライディングウィンドウ → 2 つのポインターを使います
- 部分配列の合計 → 累積和を使います
- 最長部分文字列 → スライディングウィンドウと HashMap を使います
- 木の走査 → 適切なデータ構造を使って DFS/BFS を行います
6. 比較:Java と Python
実装を比較するとき:
Java の強み:
- 明示的な型により、エラーを早期に発見できます
- パフォーマンスが重要なコードに適しています
- データ構造の使用方法が明確です
Python の強み:
- より簡潔で読みやすいです
- 豊富な標準ライブラリがあります(collections、itertools)
- 迅速なプロトタイピングに適しています
次のような不整合を指摘します:
- 使用しているアルゴリズムが異なる(同じアプローチにすべきです)
- 時間計算量または空間計算量が異なる
- 一方のバージョンでエッジケースの処理が欠けている
7. レビュー出力形式
レビューは次の形式で構成します:
## Correctness: ✓ Pass / ⚠ Issues Found
[List any correctness issues]
## Complexity Analysis
- Time: O(?) - [Explain]
- Space: O(?) - [Explain]
- Optimal: [If current solution is not optimal]
## Code Quality
**Strengths:**
- [List positive aspects]
**Issues:**
- [Issue 1] at line X: [Explanation]
- [Issue 2] at line Y: [Explanation]
**Suggestions:**
- [Suggestion 1]: [Why it's better]
- [Suggestion 2]: [Why it's better]
## Overall Assessment
[Summary and recommendation]
レビューチェックリスト
レビューを完了する前に確認します:
- エッジケースでテストした
- 時間計算量を検証した
- 空間計算量を検証した
- よくあるバグがないか確認した
- 最適な解決策と比較した
- 具体的な改善案を提案した
- 提案に対するコード例を示した
レビュー例
例 1:Two Sum
// Code under review
public int[] twoSum(int[] nums, int target) {
for (int i = 0; i < nums.length; i++) {
for (int j = i + 1; j < nums.length; j++) {
if (nums[i] + nums[j] == target) {
return new int[]{i, j};
}
}
}
return new int[]{};
}
レビュー:
- 正確性:✓ 正しく動作します
- 時間:O(n²) - O(n) に最適化できます
- 提案:確認済みの数値とそのインデックスを HashMap に保存します
最適化後:
public int[] twoSum(int[] nums, int target) {
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
int complement = target - nums[i];
if (map.containsKey(complement)) {
return new int[]{map.get(complement), i};
}
map.put(nums[i], i);
}
return new int[]{};
}
プロジェクトのコンテキスト
leetcode_java/とleetcode_python/の解法を確認します- 言語間で実装を比較します
algorithm/とdata_structure/のパターンと照らし合わせます- 分析には
doc/の計算量チャートを参照します
コメント
Markdown 対応