Pythonで配列を右にk回転させる方法【スライスで簡単実装】
配列の右回転とは?
配列Aが与えられたとき、それを右にkステップ回転することを考えます。例えば、配列 A = [5, 7, 3, 6, 8, 1, 5, 4]、k = 3 の場合、出力は [1, 5, 4, 5, 7, 3, 6, 8] となります。
各ステップでの配列の変化は以下の通りです。
- 1回転後:[4, 5, 7, 3, 6, 8, 1, 5]
- 2回転後:[5, 4, 5, 7, 3, 6, 8, 1]
- 3回転後:[1, 5, 4, 5, 7, 3, 6, 8]
つまり、1回転ごとに末尾の要素が先頭に移動し、残りの要素が一つずつ後ろにずれていくイメージです。
解法のアプローチ
この問題は、Pythonのスライスを使うことで非常にシンプルに解けます。手順は以下の通りです。
- 配列のサイズを n とします
- k = k mod n を計算します(kが配列サイズより大きい場合への対応)
- 配列を「末尾からk個の要素」+「先頭から n−k 個の要素」を連結したもので置き換えます
k %= n が必要な理由は、kが配列の長さ以上の場合でも正しく動作させるためです。例えば長さ8の配列を10回転させると、結果は2回転した場合と同じになります。
実装例
class Solution(object):
def rotate(self, nums, k):
"""
:type nums: List[int]
:type k: int
:rtype: None Do not return anything, modify nums in-place instead.
"""
n = len(nums)
k %= n
nums[:] = nums[n-k:] + nums[:n-k]
nums = [5,7,3,6,8,1,5,4]
ob1 = Solution()
ob1.rotate(nums, 3)
print(nums)
入力
nums = [5,7,3,6,8,1,5,4] k = 3
出力
[1,5,4,5,7,3,6,8]
コードのポイント
スライス代入でin-place変更を実現
この実装で重要なのは nums[:] という書き方です。これはスライス代入と呼ばれる手法で、新しいリストオブジェクトを作成する代わりに、元のリストの中身を直接置き換えます。LeetCodeなどのコーディング試験では「戻り値を返さず、配列をインプレース(in-place)で変更せよ」という制約が課されることが多く、その場合にこの書き方が必須となります。
計算量について
時間計算量は O(n)、追加のメモリ使用量も O(n) です。さらに効率化したい場合は、反転アルゴリズム(①配列全体を反転 → ②前半k個を反転 → ③残りの部分を反転)を使うことで、O(1)の追加メモリで回転を行うことも可能です。
-
Pythonの文字列スライスで文字列を回転させる方法
文字列が与えられたとき、その文字列を2つの方向にスライスして回転させるのが本記事の目的です。1つは時計回り(右回転)、もう1つは反時計回り(左回転)です。1. 与えられた文字列を d 要素分だけ左(反時計回り)に回転させます(d <= n)。2. 与えられた文字列を d 要素分だけ右(時計回り)に回転させます(d <= n)。実行例Input: string = pythonprogram d = 2 Output: Left Rotation: thonprogrampy Right Rotation: ampythonprogrアルゴリズムStep 1: 文字列を入力する。 S
-
配列を1つずつ時計回りに循環回転させるPythonプログラム
ユーザーが入力した配列を受け取り、その要素全体を時計回りに1つずつ循環的に回転させるのが本記事の目的です。最後尾の要素が先頭に移動し、それ以外の要素はそれぞれ後ろへ1つずつシフトされます。 実行例 入力:A = [1, 2, 3, 4, 5] 出力:[5, 1, 2, 3, 4] この例では、末尾の「5」が先頭に移動し、「1〜4」はそれぞれ1つ後ろへずれています。 アルゴリズムの手順 ステップ1:配列の要素を入力する。 ステップ2:配列の最後の要素を変数 x に保存する。 ステップ3:すべての要素を1つ後ろの位置へシフトする。 ステップ4:配列の先頭要素を x で置き換える。 ポイント