Skip to content

Conversation

@argondev22
Copy link
Owner

Status

Accepted

Runtime

3 ms (Beats 56.05%)

Memory

67.95 MB (Beats 27.54%)

Time Taken

17 m 45 s

Implement in-place rotation of an array by k steps.
@argondev22 argondev22 self-assigned this Nov 7, 2025
Copilot AI review requested due to automatic review settings November 7, 2025 14:02
@argondev22 argondev22 linked an issue Nov 7, 2025 that may be closed by this pull request
@argondev22 argondev22 moved this to Doing in My Learnings Nov 7, 2025
@argondev22 argondev22 merged commit d515eb3 into main Nov 7, 2025
4 checks passed
@argondev22 argondev22 deleted the 20251107/16-189-rotate-array branch November 7, 2025 14:03
@github-project-automation github-project-automation bot moved this from Doing to Done in My Learnings Nov 7, 2025
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.

Pull Request Overview

このPRは、LeetCode 189「配列の回転」問題の解答実装を追加するものです。配列を右にk回回転させるアルゴリズムとして、三回転法(配列全体を反転し、その後前半とk後半をそれぞれ反転する手法)を採用しています。

主な変更点:

  • rotate関数の実装: O(1)の空間計算量で配列をk回右に回転
  • reverse補助関数の実装: 配列の指定範囲を反転
Comments suppressed due to low confidence (1)

src/leetcode/189_rotate-array/20251107.ts:10

  • The value assigned to nums here is unused.
    nums = reverse(nums, k, n - 1);

Comment on lines +8 to +21
nums = reverse(nums, 0, n - 1);
nums = reverse(nums, 0, k - 1);
nums = reverse(nums, k, n - 1);
};

function reverse(nums: number[], startIndex: number, endIndex: number): number[] {
while (startIndex < endIndex) {
[nums[endIndex], nums[startIndex]] = [nums[startIndex], nums[endIndex]];

startIndex++;
endIndex--;
}
return nums;
}
Copy link

Copilot AI Nov 7, 2025

Choose a reason for hiding this comment

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

🐛 重大なバグ: 配列の変更が反映されない(-3点)

問題点:
rotate関数内でnumsreverseの戻り値を再代入していますが、これはローカル変数への再代入であり、元の配列への変更が反映されません。問題文では「in-place(その場で)配列を変更する」ことが求められています。

現在のコード:

nums = reverse(nums, 0, n - 1);
nums = reverse(nums, 0, k - 1);
nums = reverse(nums, k, n - 1);

このコードでは、numsというローカル変数が新しい参照を指すようになりますが、呼び出し元の配列は変更されません。

改善案:
reverse関数は既に配列をin-placeで変更しているので、戻り値を代入する必要はありません:

reverse(nums, 0, n - 1);
reverse(nums, 0, k - 1);
reverse(nums, k, n - 1);

または、reverse関数からreturn nums;を削除してvoid型にすることもできます:

function reverse(nums: number[], startIndex: number, endIndex: number): void {
    while (startIndex < endIndex) {
        [nums[endIndex], nums[startIndex]] = [nums[startIndex], nums[endIndex]];
        startIndex++;
        endIndex--;
    }
}

テストケース例:

const nums = [1, 2, 3, 4, 5, 6, 7];
rotate(nums, 3);
// 期待: [5, 6, 7, 1, 2, 3, 4]
// 現在の実装: [1, 2, 3, 4, 5, 6, 7] (変更されない)
Suggested change
nums = reverse(nums, 0, n - 1);
nums = reverse(nums, 0, k - 1);
nums = reverse(nums, k, n - 1);
};
function reverse(nums: number[], startIndex: number, endIndex: number): number[] {
while (startIndex < endIndex) {
[nums[endIndex], nums[startIndex]] = [nums[startIndex], nums[endIndex]];
startIndex++;
endIndex--;
}
return nums;
}
reverse(nums, 0, n - 1);
reverse(nums, 0, k - 1);
reverse(nums, k, n - 1);
};
function reverse(nums: number[], startIndex: number, endIndex: number): void {
while (startIndex < endIndex) {
[nums[endIndex], nums[startIndex]] = [nums[startIndex], nums[endIndex]];
startIndex++;
endIndex--;
}
}
}

Copilot uses AI. Check for mistakes.
Comment on lines +7 to +10

nums = reverse(nums, 0, n - 1);
nums = reverse(nums, 0, k - 1);
nums = reverse(nums, k, n - 1);
Copy link

Copilot AI Nov 7, 2025

Choose a reason for hiding this comment

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

⚠️ エッジケース: k = 0 の処理(-0.5点)

問題点:
k = 0の場合、reverse(nums, 0, -1)が呼び出されますが、これは意図しない動作を引き起こす可能性があります。k % nが0になる場合の処理を追加すべきです。

改善案:

export function rotate(nums: number[], k: number): void {
    const n = nums.length;
    k = k % n;
    
    if (k === 0) return; // 早期リターン
    
    reverse(nums, 0, n - 1);
    reverse(nums, 0, k - 1);
    reverse(nums, k, n - 1);
}

テストケース:

rotate([1, 2, 3], 0); // または rotate([1, 2, 3], 3);
// 期待: [1, 2, 3] (変更なし)
Suggested change
nums = reverse(nums, 0, n - 1);
nums = reverse(nums, 0, k - 1);
nums = reverse(nums, k, n - 1);
if (k === 0) return; // 早期リターン
reverse(nums, 0, n - 1);
reverse(nums, 0, k - 1);
reverse(nums, k, n - 1);

Copilot uses AI. Check for mistakes.
nums = reverse(nums, 0, k - 1);
nums = reverse(nums, k, n - 1);
};

Copy link

Copilot AI Nov 7, 2025

Choose a reason for hiding this comment

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

📝 ドキュメント: 関数の説明が不足(-0.5点)

問題点:
reverse関数にコメントがなく、その役割や使用方法が明確ではありません。特に、この関数は配列をin-placeで反転させる重要な補助関数です。

改善案:

/**
 * 配列の指定された範囲を in-place で反転させる
 * @param nums - 対象の配列
 * @param startIndex - 開始インデックス
 * @param endIndex - 終了インデックス
 * @returns 反転後の配列(参照渡しのため同じ配列)
 */
function reverse(nums: number[], startIndex: number, endIndex: number): number[] {
    while (startIndex < endIndex) {
        [nums[endIndex], nums[startIndex]] = [nums[startIndex], nums[endIndex]];
        startIndex++;
        endIndex--;
    }
    return nums;
}
Suggested change
/**
* 配列の指定された範囲を in-place で反転させる
* @param nums - 対象の配列
* @param startIndex - 開始インデックス
* @param endIndex - 終了インデックス
* @returns 反転後の配列(参照渡しのため同じ配列)
*/

Copilot uses AI. Check for mistakes.
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.

189. Rotate Array

2 participants