Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonで指定したサイズのグループごとに配列を反転させるプログラム

この記事では、ユーザーが入力した配列とグループのサイズをもとに、指定されたサイズごとに配列を反転させるPythonプログラムを解説します。

基本的な考え方はシンプルです。まず、配列をグループサイズ(p)ずつの部分配列に分割し、各部分配列を個別に反転させます。

  • p が n の倍数でない場合: 最後のグループは p 個未満の要素が余りますが、その余った要素も含めてすべて反転します。
  • p = 1 の場合: 各要素は単独のグループとなるため、配列は元の順序のまま変化しません。
  • p ≥ n の場合: 配列全体がひとつのグループとして扱われ、すべての要素が一括で反転されます。

アルゴリズム

以下は、この処理を行う関数 Revarray(A, n, p) の手順です。ここで A は整数型配列、n は配列のサイズ、p はグループのサイズを表します。先頭から順にサイズ p の部分配列を取り出し、それぞれを反転していきます。

Revarray(A, n, p)
/* A は整数型配列、n は配列のサイズ。
   先頭から順にサイズ p の部分配列を作り、それを反転する */

ステップ 1: ループ制御変数 i を 0 で初期化する。
ステップ 2: while ループで i < n かどうかを判定する。真であれば:
   ステップ 2.1: L = i                      /* 部分配列の左端のインデックス */
   ステップ 2.2: R = min(i + p - 1, n - 1)   /* 部分配列の右端のインデックス */
   ステップ 2.3: while ループで L < R かどうかを判定する。真であれば:
      ステップ 2.3.1: 左端の要素 A[L] と右端の要素 A[R] を入れ替える。
      ステップ 2.3.2: L を 1 増やす。
      ステップ 2.3.3: R を 1 減らす。
   ステップ 2.4: while ループ終了。
   ステップ 2.5: i = i + p (次のグループへ移動)
ステップ 3: while ループ終了。
ステップ 4: 処理終了。

サンプルコード

以下は上記のアルゴリズムを実装したPythonコードです。配列のサイズ・各要素・グループのサイズをユーザーから入力として受け取り、反転後の配列を出力します。

# 指定したサイズのグループごとに配列を反転する
def arrayreverse(A, n, p):
    i = 0
    while i < n:
        L = i
        R = min(i + p - 1, n - 1)
        while L < R:
            A[L], A[R] = A[R], A[L]
            L += 1
            R -= 1
        i += p

# ドライバーコード
# 配列にデータを入力
A = list()
n = int(input("配列のサイズを入力してください ::"))
print("数値を入力してください ::")
for i in range(int(n)):
    k = int(input(""))
    A.append(int(k))

p = int(input("グループのサイズを入力してください ::"))
arrayreverse(A, n, p)
for i in range(0, n):
    print(A[i], end=" ")

コードのポイント

  • 外側の while ループが、現在処理中のグループの先頭位置(変数 i)を管理します。
  • 内側の while ループでは、左右のインデックス(L と R)を互いに近づけながら要素を交換することで、そのグループだけを効率的に反転します。
  • R は min(i + p - 1, n - 1) によって計算されるため、最後のグループが p 個未満でも範囲外アクセスを起こさずに正しく処理できます。
  • 要素の交換にはPython特有のタプル代入 A[L], A[R] = A[R], A[L] を利用しており、一時変数が不要です。

実行結果

配列のサイズを入力してください ::6
数値を入力してください ::
11
22
33
44
55
66
グループのサイズを入力してください ::2
22 11 44 33 66 55

この例では、配列 [11, 22, 33, 44, 55, 66] をサイズ 2 のグループごとに反転しているため、「11 22」→「22 11」、「33 44」→「44 33」、「55 66」→「66 55」となり、出力は「22 11 44 33 66 55」となります。


  1. Pythonで配列の反転数(転倒数)をカウントする方法

    はじめに この記事では、配列内の反転(インバージョン)をカウントする問題とその解決策について詳しく解説します。 問題定義 問題: リストが与えられたとき、その中に含まれる反転の数をカウントして表示します。 反転数とは、配列を昇順にソートされた状態にするために必要な入れ替え(スワップ)の回数を表す指標です。具体的には、i < j かつ arr[i] > arr[j] を満たす要素のペア(i, j)の総数として定義されます。 実装例 # 反転数をカウントする関数 def InvCount(arr, n): inv_count = 0 for i in range(n

  2. Pythonでアナグラム部分文字列検索プログラムを作成する方法

    はじめに この記事では、以下の問題文に対する解決策について学びます。 問題文 − テキストとパターンが与えられたとき、テキスト内に含まれるパターンおよびその順列(アナグラム)の出現位置をすべて出力します。 例えば、テキストが「TUTORIALSPOINT」、パターンが「TOR」であれば、「ROT」や「OTR」といった並べ替えも検索対象となります。 アルゴリズムの考え方 この問題は、スライディングウィンドウ(滑動窓)と文字カウント配列を組み合わせることで効率的に解くことができます。手順は以下のとおりです。 パターン内の各文字の出現回数を、カウント配列 countP に記録します。 テキストの先