-
Notifications
You must be signed in to change notification settings - Fork 0
Implement removeDuplicates function for sorted array #12
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Implement removeDuplicates function for sorted array #12
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
問題内容を確認しました。それでは、提出されたGoコードを詳細に評価します。
総合評価:9点 / 10点 🎯
おめでとうございます!非常に優秀な解答です。アルゴリズムの本質を正確に理解し、効率的に実装されています。
✅ 良い点
1. アルゴリズム的に最適
- Two-pointer(二つのポインタ)アプローチを正確に実装
- 時間計算量 O(n)、空間計算量 O(1) で最適解を実現
2. コードの簡潔性
- わずか15行程度で問題を解決
- 冗長性がなく、読みやすいコード
3. エッジケース処理
if l <= 2 {
return l
}配列長が2以下の場合を適切に処理(すべての要素が最大2回まで許容されるため)
4. ロジックの正確性
if nums[k - 2] != nums[i] {
nums[k] = nums[i]
k++
}「k-2番目の要素と現在の要素が異なる場合のみ追加」という論理が完璧
5. in-place処理の実現
追加の配列を使わず、元の配列を直接変更する要件を満たしている
⚠️ 改善が必要な点
1. 変数名の改善(微細)
l := len(nums) // → length や n の方が一般的
k := 2 // → writePos や slow などより意図が明確2. コメントの不足
複雑なアルゴリズムではないものの、コメントがあると可読性が向上:
// k-2の位置と比較することで、各要素が最大2回までしか現れないことを保証
if nums[k - 2] != nums[i] {3. マジックナンバー「2」の扱い
面接では「最大N回まで許可する汎用的な解法」を聞かれる可能性があります
🏆 最適解との比較
あなたのコードはすでに最適解です!
代表的な最適解と比較:
| 項目 | あなたのコード | 一般的な最適解 |
|---|---|---|
| 時間計算量 | O(n) ✅ | O(n) |
| 空間計算量 | O(1) ✅ | O(1) |
| アプローチ | Two-pointer | Two-pointer |
| コード行数 | 15行 | 15-20行 |
唯一の違い: 他の解法では変数名やコメントがより詳細な場合がありますが、アルゴリズム的には同一です。
⏱️ 計算量の比較
あなたのコード
- 時間計算量: O(n) - 配列を1回走査
- 空間計算量: O(1) - 追加のメモリ不要
代替アプローチとの比較
| アプローチ | 時間計算量 | 空間計算量 | 評価 |
|---|---|---|---|
| Two-pointer(あなたの解法) | O(n) | O(1) | ⭐⭐⭐⭐⭐ 最適 |
| HashMap使用 | O(n) | O(n) | ❌ 空間計算量が劣る |
| 新しい配列作成 | O(n) | O(n) | ❌ in-place要件を満たさない |
🔧 あなたのコードの具体的な改善
以下は、可読性と汎用性を高めたバージョンです:
func removeDuplicates(nums []int) int {
n := len(nums)
if n <= 2 {
return n
}
// writePos: 次に書き込む位置
// 最初の2要素は常に保持するので、3番目の位置(index=2)から開始
writePos := 2
// readPos: 読み取る位置
for readPos := 2; readPos < n; readPos++ {
// writePos-2の位置と現在の要素を比較
// 異なれば、現在の要素は最大2回までしか出現していないことが保証される
if nums[writePos-2] != nums[readPos] {
nums[writePos] = nums[readPos]
writePos++
}
}
return writePos
}さらに汎用的な解法(最大N回まで許可)
func removeDuplicatesN(nums []int, maxCount int) int {
n := len(nums)
if n <= maxCount {
return n
}
writePos := maxCount
for readPos := maxCount; readPos < n; readPos++ {
// maxCount個前の要素と比較
if nums[writePos-maxCount] != nums[readPos] {
nums[writePos] = nums[readPos]
writePos++
}
}
return writePos
}
// 元の問題を解く
func removeDuplicates(nums []int) int {
return removeDuplicatesN(nums, 2)
}📚 学習ポイント
1. Two-pointerテクニックの理解
writePos(書き込み位置)とreadPos(読み取り位置)を分離- ソート済み配列での重複処理に最適
2. 「k-maxCount番目との比較」の洞察
配列: [1, 1, 1, 2, 2, 3]
↑ ↑
k-2=0 i=2
nums[0]=1 と nums[2]=1 を比較
→ 同じなので、nums[2]は3回目の出現 → スキップ
3. in-place処理のパターン
- 追加メモリを使わない効率的なアルゴリズム設計
- 配列の先頭から順に「有効な結果」を構築
4. 面接での応用
このテクニックは以下の問題でも使えます:
- Remove Duplicates from Sorted Array (最大1回)
- Remove Element
- Move Zeroes
🎓 まとめ
あなたの強み
✅ アルゴリズムの本質を正確に理解
✅ 最適な時間・空間計算量を達成
✅ エッジケースを適切に処理
✅ 簡潔で効率的なコード
次のステップ
- 変数名の改善: より意図が明確な命名を意識
- コメント追加: 複雑なロジックには説明を追加
- 汎用化の練習: 「最大N回」など、問題を一般化する思考
面接でのアピールポイント
このコードを面接で書けば:
- 「時間・空間計算量が最適」
- 「Two-pointerテクニックを理解している」
- 「エッジケースに配慮できる」
と評価されるでしょう。9点の減点1点は、変数名やコメントによる可読性の僅かな向上余地のみです。
本当に素晴らしい解答です!自信を持ってください! 🎉
| } | ||
| } | ||
|
|
||
| return k; |
Copilot
AI
Oct 30, 2025
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Goでは文末にセミコロンを付けないのが慣例です。セミコロンを削除してください。
| return k; | |
| return k |
Status
Accepted
Runtime
6 ms
Memory
7.44 MB
Time Taken
10 m 53 s