Skip to content

Conversation

@argondev22
Copy link
Owner

@argondev22 argondev22 commented Oct 27, 2025

Status

Accepted

Runtime

0 ms

Memory

59.12 MB

Time Taken

9 m 0 s

…eScript. The function modifies the input array in place and returns the new length of the array.
@argondev22 argondev22 self-assigned this Oct 27, 2025
Copilot AI review requested due to automatic review settings October 27, 2025 21:55
@argondev22 argondev22 linked an issue Oct 27, 2025 that may be closed by this pull request
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📊 コーディング面接評価レポート


総合評価:9点 / 10点

あなたの解答は非常に優れています!ほぼ完璧な実装で、面接では高く評価される内容です。


✅ 良い点

1. 正確性 (完璧)

  • 問題の要件を完全に満たしています
  • ソート済み配列から重複を正しく除去
  • k(ユニーク要素数)を正確に返却

2. 最適な時間計算量

  • O(n): 配列を1回だけ走査
  • これ以上の改善は理論的に不可能

3. 最適な空間計算量

  • O(1): 追加メモリを使用しないin-place処理
  • 問題の要件を完璧に満たす

4. Two-Pointer法の適切な実装

// あなたの解答の動作例
// nums = [0,0,1,1,1,2,2,3,3,4]

k=1 (書き込み位置)
i=1: nums[0]=0, nums[1]=0  同じ、スキップ
i=2: nums[1]=0, nums[2]=1  異なる  nums[1]=1, k=2
i=3: nums[2]=1, nums[3]=1  同じ、スキップ
i=4: nums[3]=1, nums[4]=1  同じ、スキップ
i=5: nums[4]=1, nums[5]=2  異なる  nums[2]=2, k=3
i=6: nums[5]=2, nums[6]=2  同じ、スキップ
i=7: nums[6]=2, nums[7]=3  異なる  nums[3]=3, k=4
i=8: nums[7]=3, nums[8]=3  同じ、スキップ
i=9: nums[8]=3, nums[9]=4  異なる  nums[4]=4, k=5

結果: k=5, nums=[0,1,2,3,4,_,_,_,_,_]

5. コードの可読性

  • シンプルで理解しやすい
  • 変数名が適切
  • 不要な複雑さがない

⚠️ 改善が必要な点

エッジケースの処理

問題点: 空配列(nums.length === 0)のケースが考慮されていない

// 現在のコード
export function removeDuplicates(nums: number[]): number {
    let k = 1  // ← nums.length = 0の場合、k=1を返してしまう
    for (let i = 1; i < nums.length; i++) {
        if (nums[i - 1] !== nums[i]) {
            nums[k] = nums[i]
            k++
        }
    }
    return k;
}

// 問題のシナリオ
removeDuplicates([])  // 期待値: 0, 実際: 1 ❌

制約の確認:

  • 問題の制約は「1 <= nums.length <= 30,000」
  • つまり空配列は入力として来ない
  • しかし、実際の面接やプロダクションコードでは防御的プログラミングが求められることも

🔍 最適解との比較

あなたの解答 vs 最適解

// あなたの解答 (ほぼ最適)
export function removeDuplicates(nums: number[]): number {
    let k = 1
    for (let i = 1; i < nums.length; i++) {
        if (nums[i - 1] !== nums[i]) {
            nums[k] = nums[i]
            k++
        }
    }
    return k;
}

// 最適解 (エッジケース対応版)
export function removeDuplicates(nums: number[]): number {
    if (nums.length === 0) return 0;  // エッジケース対応
    
    let k = 1;
    for (let i = 1; i < nums.length; i++) {
        if (nums[i - 1] !== nums[i]) {
            nums[k] = nums[i];
            k++;
        }
    }
    return k;
}

比較結果

項目 あなたの解答 最適解 差異
時間計算量 O(n) O(n) 同じ ✅
空間計算量 O(1) O(1) 同じ ✅
正確性 99% 100% エッジケース
可読性 高い 高い 同じ ✅

📈 計算量の比較

時間計算量

あなたの解答: O(n)

  • 配列を1回走査
  • 各要素に対して定数時間の操作
  • 最適

代替アプローチとの比較:

// ❌ 非効率な方法 O(n²)
function removeDuplicatesSlow(nums: number[]): number {
    let k = 0;
    for (let i = 0; i < nums.length; i++) {
        let isDuplicate = false;
        for (let j = 0; j < i; j++) {  // 二重ループ
            if (nums[j] === nums[i]) {
                isDuplicate = true;
                break;
            }
        }
        if (!isDuplicate) {
            nums[k] = nums[i];
            k++;
        }
    }
    return k;
}

空間計算量

あなたの解答: O(1)

  • 変数kiのみ使用
  • 配列を変更するが追加メモリは不要
  • 最適

🛠️ あなたのコードの具体的な改善

改善版 1: エッジケース対応

export function removeDuplicates(nums: number[]): number {
    // エッジケース: 空配列
    if (nums.length === 0) return 0;
    
    let k = 1;
    for (let i = 1; i < nums.length; i++) {
        if (nums[i - 1] !== nums[i]) {
            nums[k] = nums[i];
            k++;
        }
    }
    return k;
}

改善版 2: より防御的な実装(面接でアピール可能)

export function removeDuplicates(nums: number[]): number {
    // 入力検証
    if (!nums || nums.length === 0) return 0;
    if (nums.length === 1) return 1;
    
    let k = 1;  // 書き込み位置(slow pointer)
    
    // Fast pointerで配列を走査
    for (let i = 1; i < nums.length; i++) {
        // 前の要素と異なる場合のみ書き込み
        if (nums[i] !== nums[i - 1]) {
            nums[k] = nums[i];
            k++;
        }
    }
    
    return k;
}

改善版 3: 別の比較方法(同じ効率)

export function removeDuplicates(nums: number[]): number {
    if (nums.length === 0) return 0;
    
    let k = 1;
    for (let i = 1; i < nums.length; i++) {
        // nums[k-1]と比較する方法
        if (nums[k - 1] !== nums[i]) {
            nums[k] = nums[i];
            k++;
        }
    }
    return k;
}

📚 学習ポイント

1. Two-Pointer法の理解

あなたのコードはTwo-Pointer法の典型例です:

  • Slow Pointer (k): 次に書き込む位置
  • Fast Pointer (i): 配列を探索

2. ソート済み配列の活用

// ソート済み → 重複は隣接している
// ✅ O(n)で解決可能
if (nums[i - 1] !== nums[i]) { ... }

// もしソートされていなければ...
// ❌ O(n²)またはSet使用でO(n)だが追加メモリ必要

3. In-place処理のパターン

// パターン: 条件を満たす要素を前方に詰める
let k = 0;  // 書き込み位置
for (let i = 0; i < nums.length; i++) {
    if (/* 条件 */) {
        nums[k] = nums[i];
        k++;
    }
}
return k;

4. エッジケースの重要性

面接では以下を確認する習慣をつけましょう:

// 常に考慮すべきエッジケース
- 空配列: []
- 単一要素: [1]
- すべて同じ: [1,1,1,1]
- すべて異なる: [1,2,3,4]
- 最小/最大値: [-100], [100]

5. 面接でのコミュニケーション

1. 問題を復唱して理解を確認
2. 制約を確認(ソート済み、サイズ範囲)
3. エッジケースを質問
4. アプローチを説明してから実装
5. 計算量を分析
6. テストケースで検証

🎯 まとめ

強み

✅ Two-Pointer法を正しく実装
✅ 最適な時間計算量 O(n)
✅ 最適な空間計算量 O(1)
✅ コードがシンプルで可読性が高い
✅ 問題の要件を完全に満たす

改善点

⚠️ エッジケース(空配列)の処理を追加すると完璧

推奨アクション

  1. エッジケースチェックを追加

    if (nums.length === 0) return 0;
  2. 面接での説明

    • 「制約上、空配列は来ないと理解していますが、防御的プログラミングとして...」
    • このような発言が面接官に好印象を与えます
  3. 次のステップ


総合判定: 優秀 🌟

あなたの解答は実質的に最適解です。1行のエッジケースチェックを追加するだけで完璧な10点満点になります。この調子で頑張ってください! 🚀

Copy link

@cursor cursor bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This PR is being reviewed by Cursor Bugbot

Details

You are on the Bugbot Free tier. On this plan, Bugbot will review limited PRs each billing cycle.

To receive Bugbot reviews on all of your PRs, visit the Cursor dashboard to activate Pro and start your 14-day free trial.

@argondev22 argondev22 merged commit 8ac9734 into main Oct 27, 2025
1 check passed
@argondev22 argondev22 deleted the 20251028/6-26-remove-duplicates-from-sorted-array branch October 27, 2025 22:30
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

26. Remove Duplicates from Sorted Array

2 participants