【Java入門】配列を左に回転させるプログラムの書き方と仕組みを解説
配列ローテーションとは
配列のローテーション(回転)とは、配列内の要素を指定した位置数だけ前後にずらす操作のことです。本記事では、Javaを使って配列を左方向へ回転させるプログラムを紹介し、その仕組みをわかりやすく解説します。
サンプルコード
以下は、配列を左に回転させるJavaプログラムの完全なコード例です。
public class Demo{
void rotate_left(int my_arr[], int d, int len){
d = d % len;
int i, j, k, temp;
int divisor = greatest_Common_divisor(d, len);
for (i = 0; i < divisor; i++){
temp = my_arr[i];
j = i;
while (true){
k = j + d;
if (k >= len)
k = k - len;
if (k == i)
break;
my_arr[j] = my_arr[k];
j = k;
}
my_arr[j] = temp;
}
}
void display_arr(int my_arr[], int size){
int i;
for (i = 0; i < size; i++)
System.out.print(my_arr[i] + " ");
}
int greatest_Common_divisor(int a, int b){
if (b == 0)
return a;
else
return greatest_Common_divisor(b, a % b);
}
public static void main(String[] args){
Demo my_inst = new Demo();
int my_arr[] = { 5, 7, 89, 91, 34, 21, 11, 0 };
System.out.println("Rotating the array to the left ");
my_inst.rotate_left(my_arr, 2, 8);
System.out.println("Displaying the array from a specific index ");
my_inst.display_arr(my_arr, 8);
}
}実行結果
Rotating the array to the left Displaying the array from a specific index 89 91 34 21 11 0 5 7
コードの解説
rotate_leftメソッド(回転処理)
Demoクラスには、配列を左に回転させるrotate_leftメソッドが定義されています。このメソッドは3つの引数を受け取ります。
- my_arr:回転対象となる配列
- d:配列を回転させる位置の数(回転量)
- len:配列のサイズ(要素数)
まず「d = d % len」によって回転量を正規化しています。これにより、回転量dが配列の長さよりも大きい場合でも正しく動作します。次に、後述するgreatest_Common_divisorメソッドを呼び出してdとlenの最大公約数を求め、その値の回数だけforループを繰り返します。
この手法は「ジャグリングアルゴリズム」と呼ばれるもので、一時変数を1つだけ使って要素を効率的に移動させることができるのが特徴です。
display_arrメソッド(配列の表示)
display_arrメソッドは、渡された配列の要素を先頭から順番にコンソールへ出力するための補助メソッドです。
greatest_Common_divisorメソッド(最大公約数)
greatest_Common_divisorメソッドは、2つの整数の最大公約数(GCD)を求める再帰関数です。「ユークリッドの互除法」という古典的なアルゴリズムを採用しており、bが0になった時点でのaが最大公約数として返されます。
mainメソッド(プログラムのエントリーポイント)
mainメソッドでは、まずDemoクラスのインスタンスを生成し、初期値を持つ配列を定義しています。その後、rotate_leftメソッドを呼び出して配列を2つ分だけ左に回転させ、最後にdisplay_arrメソッドで結果を表示しています。
出力結果の確認
元の配列は {5, 7, 89, 91, 34, 21, 11, 0} です。これを2つ分だけ左に回転すると、先頭の2要素(5と7)が末尾に移動し、結果として {89, 91, 34, 21, 11, 0, 5, 7} が出力されます。実行結果からも、意図どおりに回転されていることが確認できます。
計算量について
このジャグリングアルゴリズムによる配列回転は、時間計算量がO(n)、追加の記憶領域はO(1)で済むため、大規模な配列に対しても効率的に動作します。要素を1つずつシフトする単純な方法(O(n×d))と比べて大幅に高速である点も大きなメリットです。
-
配列の全要素を乗算するC++プログラムの解説
整数型の要素を持つ配列が与えられたとき、配列内のすべての要素を掛け合わせ、その積を表示することを考えます。本記事では、この問題をC++(C言語スタイルのコード)で解く方法を、アプローチ、アルゴリズム、サンプルコード、実行結果まで順を追って解説します。 例 入力: arr[]={1,2,3,4,5,6,7} 出力: 1 x 2 x 3 x 4 x 5 x 6 x 7 = 5040 入力: arr[]={3, 4, 6, 2, 7, 8, 4} 出力: 3 x 4 x 6 x 2 x 7 x 8 x 4 = 32256 解き方のアプローチ この問題は、累積用の一時変数を用意し、配列の要素を先頭
-
Pythonでアナグラム部分文字列検索プログラムを作成する方法
はじめに この記事では、以下の問題文に対する解決策について学びます。 問題文 − テキストとパターンが与えられたとき、テキスト内に含まれるパターンおよびその順列(アナグラム)の出現位置をすべて出力します。 例えば、テキストが「TUTORIALSPOINT」、パターンが「TOR」であれば、「ROT」や「OTR」といった並べ替えも検索対象となります。 アルゴリズムの考え方 この問題は、スライディングウィンドウ(滑動窓)と文字カウント配列を組み合わせることで効率的に解くことができます。手順は以下のとおりです。 パターン内の各文字の出現回数を、カウント配列 countP に記録します。 テキストの先