C#で配列をk回回転させる方法|反転アルゴリズムによる実装を解説
配列と整数 k が与えられたとき、その配列を k 回回転させるのが本記事のテーマです。例えば k = 3 が指定された場合、配列は3回分だけ回転します。
ここで紹介するのは「反転アルゴリズム(Reversal Algorithm)」と呼ばれる定番手法です。配列全体を一度反転し、その後それぞれの区間を再度反転するだけで、追加メモリほぼゼロで効率的に回転を実現できます。
アルゴリズムの基本手順
まず、配列・開始インデックス・終了インデックスを引数として受け取る Reverse メソッドを作成します。このメソッドを活用し、次の3ステップで回転を行います。
- ステップ1: 配列全体(インデックス0 ~ 配列長-1)を反転する
- ステップ2: 先頭から
k番目まで(インデックス0 ~ k-1)を反転する - ステップ3: 残りの部分(インデックスk ~ 配列長-1)を反転する
C#での実装例
using System;
namespace ConsoleApplication {
public class Arrays {
public void ReverseArrayKTimes(int[] arr, int k) {
Reverse(arr, 0, arr.Length - 1);
Reverse(arr, 0, k - 1);
Reverse(arr, k, arr.Length - 1);
}
private void Reverse(int[] arr, int start, int end) {
while (start < end) {
int temp = arr[start];
arr[start] = arr[end];
arr[end] = temp;
start++;
end--;
}
}
}
class Program {
static void Main(string[] args) {
Arrays a = new Arrays();
int[] arr = { 9, 8, 7, 6, 5, 4, 3, 2, 1 };
a.ReverseArrayKTimes(arr, 3);
for (int i = 0; i < arr.Length; i++) {
Console.WriteLine(arr[i]);
}
Console.ReadLine();
}
}
}
実行結果
3 2 1 9 8 7 6 5 4
処理の流れをステップごとに確認
サンプルコードでは、初期配列 { 9, 8, 7, 6, 5, 4, 3, 2, 1 } を k = 3 で回転しています。各ステップでの配列の状態は以下の通りです。
- 初期状態:9 8 7 6 5 4 3 2 1
- ステップ1(全体を反転):1 2 3 4 5 6 7 8 9
- ステップ2(先頭3要素を反転):3 2 1 4 5 6 7 8 9
- ステップ3(残りを反転):3 2 1 9 8 7 6 5 4
計算量について
このアルゴリズムの時間計算量は O(n)、追加で必要な空間計算量は O(1) です。一時変数を使って要素を入れ替えるだけで済むため、新しい配列を確保してコピーする方法よりもメモリ効率に優れています。
-
C#で配列の次元数(ランク)を定義・取得する方法
C#において、配列の次元数(ランク)を調べたい場合は、Arrayクラスが提供する Rank プロパティを使用します。このプロパティは、配列が持つ次元の数を整数値として返します。Rankプロパティの使い方次元数を取得するには、以下のように記述します。arr.Rankここで、arrは対象となる配列です。例えば、次のような2次元配列を考えてみましょう。int[] arr = new int[3,4];行数・列数を取得するにはGetLengthメソッドを使う配列の次元数だけでなく、各次元の要素数(行数や列数など)を取得したい場合は、GetLength メソッドを使用します。引数には対象の次元のインデッ
-
C#で配列を宣言する方法とは?基本構文とサンプルコードを解説
C#で配列を宣言するには、次の構文を使用します。 datatype[ ] 配列名; それぞれの構成要素の意味は以下のとおりです。 datatype … 配列に格納する要素のデータ型を指定します。 [ ] … この変数が配列であることを示します。 配列名 … 配列につける名前を指定します。 たとえば、double型の配列「balance」を宣言する場合は次のように書きます。 double[ ] balance; なお、この段階では配列の実体(メモリ領域)はまだ確保されていません。実際に要素を格納するには、new演算子を使って配列をインスタンス化し、要素数を指定する必要があります。 続いて、