配列の反転 または 配列を反転する これは、指定された配列の各数値の位置を末尾から反対の位置に変更することを意味します。つまり、数値が位置 1 にある場合、その新しい位置は Array.length になります。同様に、数値が位置 2 にある場合、その新しい位置は次のようになります。 Array.length – 1 など。
C/C++/Java/Python/JavaScript での配列の反転
配列 (または文字列) が与えられた場合、タスクは配列/文字列を反転することです。
例:
入力: オリジナル配列[] = {1, 2, 3} 出力: array_reversed[] = {3, 2, 1}
入力: オリジナル配列[] = {4, 5, 1, 2}
出力: array_reversed[] = {2, 1, 5, 4}
目次
- 1. 追加の配列を使用した配列の反転 (非インプレース):
- 2. ループを使用した配列の反転 (インプレース):
- 3. 配列反転組み込みメソッド (非インプレース):
- 4. 配列の逆再帰 (インプレースまたは非インプレース):
- 5. 配列逆スタック (非インプレース):
1. 配列の反転 追加の配列の使用 (非インプレース):
- 元の配列と同じサイズの新しい配列を作成します。
- 元の配列から新しい配列に要素を逆の順序でコピーします。
上記のアプローチの実装を以下に示します。
C++
#include ; using namespace std; void reverseArrayExtraArray(int arr[], int size) { int reversedArr[size]; for (int i = 0; i < size; i++) { reversedArr[i] = arr[size - i - 1]; } // Print reversed array cout << 'Reversed Array: '; for (int i = 0; i < size; i++) { std::cout << reversedArr[i] << ' '; } } int main() { int originalArr[] = { 1, 2, 3, 4, 5 }; int size = sizeof(originalArr) / sizeof(originalArr[0]); reverseArrayExtraArray(originalArr, size); }>
C #include void reverseArrayExtraArray(int arr[], int size) { int reversedArr[size]; for (int i = 0; i < size; i++) { reversedArr[i] = arr[size - i - 1]; } // Print reversed array printf('Reversed Array: '); for (int i = 0; i < size; i++) { printf('%d ', reversedArr[i]); } } int main() { int originalArr[] = { 1, 2, 3, 4, 5 }; int size = sizeof(originalArr) / sizeof(originalArr[0]); reverseArrayExtraArray(originalArr, size); return 0; }>
ジャワ /*package whatever //do not write package name here */ import java.io.*; public class ReverseArrayExtraArray { public static void reverseArrayExtraArray(int[] arr) { int[] reversedArr = new int[arr.length]; for (int i = 0; i < arr.length; i++) { reversedArr[i] = arr[arr.length - i - 1]; } // Print reversed array System.out.print('Reversed Array: '); for (int i : reversedArr) { System.out.print(i + ' '); } } public static void main(String[] args) { int[] originalArr = { 1, 2, 3, 4, 5 }; reverseArrayExtraArray(originalArr); } }>
パイソン def reverse_array_extra_array(arr): reversed_arr = arr[::-1] # Print reversed array print('Reversed Array:', end=' ') for i in reversed_arr: print(i, end=' ') # Example usage: original_arr = [1, 2, 3, 4, 5] reverse_array_extra_array(original_arr)>
C# using System; class Program { static void ReverseArrayExtraArray(int[] arr) { int[] reversedArr = new int[arr.Length]; for (int i = 0; i < arr.Length; i++) { reversedArr[i] = arr[arr.Length - i - 1]; } // Print reversed array Console.Write('Reversed Array: '); foreach (int num in reversedArr) { Console.Write(num + ' '); } } static void Main() { int[] originalArr = {1, 2, 3, 4, 5}; ReverseArrayExtraArray(originalArr); } }>
JavaScript function reverseArrayExtraArray(arr) { const reversedArr = arr.slice().reverse(); // Print reversed array process.stdout.write('Reversed Array: '); reversedArr.forEach(element =>process.stdout.write(要素 + ' ')); } // 使用例: constoriginalArr = [1, 2, 3, 4, 5]; reverseArrayExtraArray(originalArr);>>
出力
Reversed Array: 5 4 3 2 1>
- 時間計算量: の上)
- 要素を新しい配列にコピーすることは線形操作です。
- 補助スペースの複雑さ: の上)
- 新しい配列を保存するために追加のスペースが使用されます。
2. 配列の反転 ループの使用 (インプレース):
- 次を使用して配列を反復処理します。 2つのポインター (開始と終了)。
- 開始ポインターと終了ポインターで要素を交換します。
- 開始ポインタを終了方向に移動し、終了ポインタを開始方向に移動して、それらが互いに交わるか交差するまで移動します。
以下は、上記のアプローチの実装です。
C++ // Iterative C++ program to reverse an array #include ; using namespace std; /* Function to reverse arr[] from start to end*/ void reverseArray(int arr[], int start, int end) { while (start < end) { int temp = arr[start]; arr[start] = arr[end]; arr[end] = temp; start++; end--; } } /* Utility function to print an array */ void printArray(int arr[], int size) { for (int i = 0; i < size; i++) cout << arr[i] << ' '; cout << endl; } /* Driver function to test above functions */ int main() { int arr[] = { 1, 2, 3, 4, 5, 6 }; int n = sizeof(arr) / sizeof(arr[0]); // To print original array printArray(arr, n); // Function calling reverseArray(arr, 0, n - 1); cout << 'Reversed array is' << endl; // To print the Reversed array printArray(arr, n); return 0; }>
C // Iterative C program to reverse an array #include /* Function to reverse arr[] from start to end*/ void reverseArray(int arr[], int start, int end) { int temp; while (start < end) { temp = arr[start]; arr[start] = arr[end]; arr[end] = temp; start++; end--; } } /* Utility that prints out an array on a line */ void printArray(int arr[], int size) { int i; for (i = 0; i < size; i++) printf('%d ', arr[i]); printf('
'); } /* Driver function to test above functions */ int main() { int arr[] = { 1, 2, 3, 4, 5, 6 }; int n = sizeof(arr) / sizeof(arr[0]); printArray(arr, n); reverseArray(arr, 0, n - 1); printf('Reversed array is
'); printArray(arr, n); return 0; }>
ジャワ public class GFG { /* Function to reverse arr[] from start to end*/ static void reverseArray(int arr[], int start, int end) { int temp; while (start < end) { temp = arr[start]; arr[start] = arr[end]; arr[end] = temp; start++; end--; } } /* Utility that prints out an array on a line */ static void printArray(int arr[], int size) { for (int i = 0; i < size; i++) System.out.print(arr[i] + ' '); System.out.println(); } // Driver code public static void main(String args[]) { int arr[] = {1, 2, 3, 4, 5, 6}; printArray(arr, 6); reverseArray(arr, 0, 5); System.out.print('Reversed array is
'); printArray(arr, 6); } }>
パイソン # Iterative python program to reverse an array # Function to reverse A[] from start to end def reverseList(A, start, end): while start < end: A[start], A[end] = A[end], A[start] start += 1 end -= 1 # Driver function to test above function A = [1, 2, 3, 4, 5, 6] print(A) reverseList(A, 0, 5) print('Reversed list is') print(A) # This program is contributed by Pratik Chhajer>
C# // Iterative C# program to reverse an // array using System; class GFG { /* Function to reverse arr[] from start to end*/ static void reverseArray(int[] arr, int start, int end) { int temp; while (start < end) { temp = arr[start]; arr[start] = arr[end]; arr[end] = temp; start++; end--; } } /* Utility that prints out an array on a line */ static void printArray(int[] arr, int size) { for (int i = 0; i < size; i++) Console.Write(arr[i] + ' '); Console.WriteLine(); } // Driver function public static void Main() { int[] arr = { 1, 2, 3, 4, 5, 6 }; printArray(arr, 6); reverseArray(arr, 0, 5); Console.Write('Reversed array is
'); printArray(arr, 6); } } // This code is contributed by Sam007>
JavaScript // Iterative Javascript program to reverse an array /* Function to reverse arr[] from start to end*/ function reverseArray(arr,start,end) { while (start < end) { var temp = arr[start]; arr[start] = arr[end]; arr[end] = temp; start++; end--; } } /* Utility function to print an array */ function printArray(arr,size) { for (var i = 0; i < size; i++){ console.log(arr[i]); } } /* Driver function to test above functions */ var arr= [1, 2, 3, 4, 5, 6]; var n = 6; // To print original array printArray(arr, n); // Function calling reverseArray(arr, 0, n-1); console.log('Reversed array is'); printArray(arr, n);>
PHP // Iterative PHP program // to reverse an array /* Function to reverse $arr from start to end*/ function reverseArray(&$arr, $start, $end) { while ($start < $end) { $temp = $arr[$start]; $arr[$start] = $arr[$end]; $arr[$end] = $temp; $start++; $end--; } } /* Utility function to print an array */ function printArray(&$arr, $size) { for ($i = 0; $i < $size; $i++) echo $arr[$i] . ' '; echo '
'; } // Driver code $arr = array(1, 2, 3, 4, 5, 6); // To print original array printArray($arr, 6); // Function calling reverseArray($arr, 0, 5); echo 'Reversed array is' .'
'; // To print the Reversed array printArray($arr, 6); // This code is contributed // by ChitraNayal ?>>>
出力
1 2 3 4 5 6 Reversed array is 6 5 4 3 2 1>
- 時間計算量: の上)
- ループは配列の半分を実行するため、配列のサイズに関して線形になります。
- 補助スペースの複雑さ: ○(1)
- インプレース反転。つまり、追加のスペースを使用しません。
3. 配列反転組み込みメソッド (非インプレース):
- 次のような組み込みメソッドを使用します
reverse>
Python またはArray.Reverse>
C#で。
以下は、上記のアプローチの実装です。
C++ #include // for std::reverse #include int main() { int originalArray[] = { 1, 2, 3, 4, 5 }; int length = sizeof(originalArray) / sizeof(originalArray[0]); // Using inbuilt method in C++ std::reverse(originalArray, originalArray + length); // Print the reversed array for (int i = 0; i < length; i++) { std::cout << originalArray[i] << ' '; } return 0; }>
ジャワ /*package whatever //do not write package name here */ import java.util.Arrays; public class ArrayReverse { public static void main(String[] args) { int[] originalArray = { 1, 2, 3, 4, 5 }; // Using inbuilt method in Java int[] reversedArray = new int[originalArray.length]; for (int i = 0; i < originalArray.length; i++) { reversedArray[i] = originalArray[originalArray.length - 1 - i]; } // Print the reversed array System.out.println(Arrays.toString(reversedArray)); } }>
パイソン original_array = [1, 2, 3, 4, 5] # Using inbuilt method in Python reversed_array = list(reversed(original_array)) # Print the reversed array print(reversed_array)>
C# using System; class Program { static void Main() { int[] originalArray = { 1, 2, 3, 4, 5 }; // Using inbuilt method in C# Array.Reverse(originalArray); // Print the reversed array foreach(int num in originalArray) { Console.Write(num + ' '); } } }>
JavaScript let originalArray = [1, 2, 3, 4, 5]; // Using inbuilt method in JavaScript let reversedArray = originalArray.slice().reverse(); // Print the reversed array console.log(reversedArray);>
出力
5 4 3 2 1>
- 時間計算量: O(n)
reverse>
通常、この方法の時間計算量は線形です。 - 補助スペースの複雑さ: の上)
- 追加のスペースは、反転された配列を格納するために使用されます。
4. 配列の逆再帰 (インプレースまたは非インプレース):
- 配列を入力として受け取る再帰関数を定義します。
- 最初の要素と最後の要素を入れ替えます。
- 残りの部分配列を使用して関数を再帰的に呼び出します。
以下は、上記のアプローチの実装です。
ジャワ島C++
// Recursive C++ program to reverse an array #include ; using namespace std; /* Function to reverse arr[] from start to end*/ void reverseArray(int arr[], int start, int end) { if (start>= 終了) 戻る; int temp = arr[開始]; arr[開始] = arr[終了]; 到着[終了] = 温度; // reverseArray(arr, start + 1, end - 1) を呼び出す再帰関数; } /* 配列を出力するユーティリティ関数 */ void printArray(int arr[], int size) { for (int i = 0; i< size; i++) cout << arr[i] << ' '; cout << endl; } /* Driver function to test above functions */ int main() { int arr[] = { 1, 2, 3, 4, 5, 6 }; // To print original array printArray(arr, 6); // Function calling reverseArray(arr, 0, 5); cout << 'Reversed array is' << endl; // To print the Reversed array printArray(arr, 6); return 0; }>
C // Recursive C program to reverse an array #include ; /* Function to reverse arr[] from start to end*/ void reverseArray(int arr[], int start, int end) { int temp; if (start>= 終了) 戻る; temp = arr[開始]; arr[開始] = arr[終了]; 到着[終了] = 温度; reverseArray(arr, 開始 + 1, 終了 - 1); } /* 配列を 1 行に出力するユーティリティ */ void printArray(int arr[], int size) { int i; for (i = 0; i< size; i++) printf('%d ', arr[i]); printf('
'); } /* Driver function to test above functions */ int main() { int arr[] = { 1, 2, 3, 4, 5, 6 }; printArray(arr, 6); reverseArray(arr, 0, 5); printf('Reversed array is
'); printArray(arr, 6); return 0; }>
ジャワ /*package whatever //do not write package name here */ import java.io.*; class ReverseArray { /* Function to reverse arr[] from start to end*/ static void reverseArray(int arr[], int start, int end) { int temp; if (start>= 終了) 戻る; temp = arr[開始]; arr[開始] = arr[終了]; 到着[終了] = 温度; reverseArray(arr, 開始 + 1, 終了 - 1); } /* 配列を 1 行に出力するユーティリティ */ static void printArray(int arr[], int size) { for (int i = 0; i< size; i++) System.out.print(arr[i] + ' '); System.out.println(''); } /*Driver function to check for above functions*/ public static void main(String[] args) { int arr[] = { 1, 2, 3, 4, 5, 6 }; printArray(arr, 6); reverseArray(arr, 0, 5); System.out.println('Reversed array is '); printArray(arr, 6); } } /*This article is contributed by Devesh Agrawal*/>
パイソン # Recursive python program to reverse an array # Function to reverse A[] from start to end def reverseList(A, start, end): if start>= end: return A[start], A[end] = A[end], A[start] reverseList(A, start+1, end-1) # 上記をテストするドライバー関数 function A = [1, 2, 3 , 4, 5, 6] print(A) reverseList(A, 0, 5) print('逆リストは') print(A) # このプログラムは Pratik Chhajer によって提供されています>>
C# // C# program to reverse an array using System; class GFG { /* Function to reverse arr[] from start to end*/ static void reverseArray(int[] arr, int start, int end) { int temp; if (start>= 終了) 戻る; temp = arr[開始]; arr[開始] = arr[終了]; 到着[終了] = 温度; reverseArray(arr, 開始 + 1, 終了 - 1); } /* 配列を 1 行に出力するユーティリティ */ static void printArray(int[] arr, int size) { for (int i = 0; i< size; i++) Console.Write(arr[i] + ' '); Console.WriteLine(''); } // Driver Code public static void Main() { int[] arr = { 1, 2, 3, 4, 5, 6 }; printArray(arr, 6); reverseArray(arr, 0, 5); Console.WriteLine('Reversed array is '); printArray(arr, 6); } } // This code is contributed by Sam007>
JavaScript // Recursive Javascript program to reverse an array /* Function to reverse arr[] from start to end*/ function reverseArray(arr,start,end) { var temp = arr[start]; arr[start] = arr[end]; arr[end] = temp; // Recursive Function calling if (start+1
PHP // Recursive PHP program to reverse an array /* Function to reverse $arr[] from $start to $end */ function reverseArray(&$arr, $start, $end) { if ($start>= $end) { 戻り値; $temp = $arr[$start]; $arr[$start] = $arr[$end]; $arr[$end] = $temp; // reverseArray($arr, $start + 1, $end - 1) を呼び出す再帰関数; } /* 配列を出力するユーティリティ関数 */ function printArray(&$arr, $size) { for ($i = 0; $i< $size; $i++) { echo $arr[$i] . ' '; } echo '
'; } // Driver function to test above functions $arr = array(1, 2, 3, 4, 5, 6); // To print original array printArray($arr, 6); // Function calling reverseArray($arr, 0, 5); echo 'Reversed array is' . '
'; // To print the Reversed array printArray($arr, 6); ?>>>
出力
1 2 3 4 5 6 Reversed array is 6 5 4 3 2 1>
- 時間計算量: の上)。再帰は各要素を 1 回通過するため、線形になります。
- 補助スペースの複雑さ: 非インプレースでは O(n)、インプレースでは O(log n) (再帰スタックのため)。
5. 配列逆スタック (非インプレース):
- 配列の各要素をスタックにプッシュします。
- スタックから要素をポップして反転配列を形成します。
以下は、上記のアプローチの実装です。
C++ #include ; #include ; #include ; void reverseArrayUsingStack(int arr[], int size) { std::stack スタック; // 要素をスタックにプッシュ for (int i = 0; i< size; i++) { stack.push(arr[i]); } // Pop elements from the stack to reverse the array for (int i = 0; i < size; i++) { arr[i] = stack.top(); stack.pop(); } } int main() { int arr[] = { 1, 2, 3, 4, 5 }; int size = sizeof(arr) / sizeof(arr[0]); reverseArrayUsingStack(arr, size); std::cout << 'Reversed Array: '; for (int i = 0; i < size; i++) { std::cout << arr[i] << ' '; } return 0; }>
C #include ; #include ; #define MAX_SIZE 100 struct Stack { int arr[MAX_SIZE]; int top; }; void push(struct Stack* stack, int element) { if (stack->top == MAX_SIZE - 1) { printf('スタック オーバーフロー
'); 戻る; stack->arr[++stack->top] = 要素; } int Pop(struct Stack* stack) { if (stack->top == -1) { printf('スタックアンダーフロー
'); 終了(1); return stack->arr[stack->top--]; void reverseArrayUsingStack(int arr[], int size) { struct スタックスタック; stack.top = -1; // 要素をスタックにプッシュ for (int i = 0; i< size; i++) { push(&stack, arr[i]); } // Pop elements from the stack to reverse the array for (int i = 0; i < size; i++) { arr[i] = pop(&stack); } } int main() { int arr[] = { 1, 2, 3, 4, 5 }; int size = sizeof(arr) / sizeof(arr[0]); reverseArrayUsingStack(arr, size); printf('Reversed Array: '); for (int i = 0; i < size; i++) { printf('%d ', arr[i]); } return 0; }>
ジャワ /*package whatever //do not write package name here */ import java.util.Stack; public class ReverseArrayUsingStack { public static void reverseArrayUsingStack(int[] arr) { Stack スタック = 新しいスタック(); // 要素をスタックにプッシュ for (int element : arr) { stack.push(element); } // スタックから要素をポップして配列を反転します (int i = 0; i< arr.length; i++) { arr[i] = stack.pop(); } } public static void main(String[] args) { int[] arr = { 1, 2, 3, 4, 5 }; reverseArrayUsingStack(arr); System.out.print('Reversed Array: '); for (int element : arr) { System.out.print(element + ' '); } } }>
パイソン def reverse_array_using_stack(arr): stack = [] # Push elements onto the stack for element in arr: stack.append(element) # Pop elements from the stack to reverse the array for i in range(len(arr)): arr[i] = stack.pop() # Example usage: arr = [1, 2, 3, 4, 5] reverse_array_using_stack(arr) print('Reversed Array:', arr)>
C# using System; using System.Collections.Generic; class Program { static void ReverseArrayUsingStack(int[] arr) { Stack スタック = 新しいスタック (); // 要素をスタックにプッシュします foreach(int element in arr) { stack.Push(element); } // 配列を反転するためにスタックから要素をポップします (int i = 0; i< arr.Length; i++) { arr[i] = stack.Pop(); } } static void Main() { int[] arr = { 1, 2, 3, 4, 5 }; ReverseArrayUsingStack(arr); Console.Write('Reversed Array: '); foreach(int element in arr) { Console.Write(element + ' '); } } }>
JavaScript function reverseArrayUsingStack(arr) { let stack = []; // Push elements onto the stack for (let i = 0; i < arr.length; i++) { stack.push(arr[i]); } // Pop elements from the stack to reverse the array for (let i = 0; i < arr.length; i++) { arr[i] = stack.pop(); } } // Example usage: let arr = [1, 2, 3, 4, 5]; reverseArrayUsingStack(arr); console.log('Reversed Array:', arr);>
出力
Reversed Array: 5 4 3 2 1>
- 時間計算量: の上)
- 各要素をスタックにプッシュおよびスタックからポップするには、線形時間が必要です。
- 補助スペースの複雑さ: の上)
- スタックを格納するために追加のスペースが使用されます。
6.ツーポインターアプローチ
- 開始を 0 に、終了をサイズ – 1 に設定します。
- ポインターが一致するまで要素を交換: start が end より小さい間、arr[start] と arr[end] を交換します。
- arr[start] と arr[end] を交換します。
- インクリメント開始とデクリメント終了。
- スタートクロスが終了するまでポインタの交換と移動を続けます。
#include void reverseArrayTwoPointer(int arr[], int size) { int start = 0; int end = size - 1; while (start < end) { // Swap elements at start and end positions int temp = arr[start]; arr[start] = arr[end]; arr[end] = temp; // Move start forward and end backward start++; end--; } } int main() { int arr[] = { 1, 2, 3, 4, 5 }; int size = sizeof(arr) / sizeof(arr[0]); reverseArrayTwoPointer(arr, size); std::cout << 'Reversed Array: '; for (int i = 0; i < size; i++) { std::cout << arr[i] << ' '; } return 0; }>
ジャワ public class ReverseArray { public static void reverseArrayTwoPointer(int[] arr) { int start = 0; int end = arr.length - 1; while (start < end) { // Swap elements at start and end positions int temp = arr[start]; arr[start] = arr[end]; arr[end] = temp; // Move start forward and end backward start++; end--; } } public static void main(String[] args) { int[] arr = { 1, 2, 3, 4, 5 }; reverseArrayTwoPointer(arr); System.out.print('Reversed Array: '); for (int i = 0; i < arr.length; i++) { System.out.print(arr[i] + ' '); } } } // This code is contributed by Shivam>
出力:
Reversed Array: 5 4 3 2 1>
時間計算量: O(n) – このアルゴリズムは配列を 1 回反復し、各要素に対して一定数の演算を実行するため、時間計算量は線形になります。
空間の複雑さ: O(1) – アルゴリズムは追加のデータ構造を使用せずに配列をその場で反転するため、入力配列のサイズに関係なく一定のスペースが必要になります。