C++で配列内のすべてのゼロを末尾に移動する方法
複数のゼロ(0)を含む配列が与えられたとき、すべてのゼロを配列の末尾に移動させる必要があります。それ以外の要素は元の順序を保ったまま前に詰めます。具体例を見てみましょう。
入力
arr = [4, 5, 0, 3, 2, 0, 0, 0, 5, 0, 1]
出力
4 5 3 2 5 1 0 0 0 0 0
アルゴリズム
配列を初期化します。
書き込み位置を示すインデックス変数を 0 で初期化します。
与えられた配列を先頭から順に走査します。
現在の要素がゼロでない場合、その値をインデックスの位置に書き込みます。
その後、インデックスを1つ進めます。
上記の処理が終わったインデックスから配列の長さ n まで繰り返すループを作成します。
残りの要素をすべて 0 に更新します。
この手法では、ゼロ以外の要素だけを前側に詰めてから、余った後半部分をゼロで埋めるという流れになります。追加の配列を使わないため、空間計算量は O(1) で済みます。
実装
以下は、上記のアルゴリズムをC++で実装したコードです。
#include <bits/stdc++.h>
using namespace std;
void moveZeroesToEnd(int arr[], int n) {
int index = 0;
for (int i = 0; i < n; i++) {
if (arr[i] != 0) {
arr[index++] = arr[i];
}
}
while (index < n) {
arr[index++] = 0;
}
}
int main() {
int arr[] = {4, 5, 0, 3, 2, 0, 0, 0, 5, 0, 1};
int n = 11;
moveZeroesToEnd(arr, n);
for (int i = 0; i < n; i++) {
cout << arr[i] << " ";
}
cout << endl;
return 0;
}出力
上記のコードを実行すると、次の結果が得られます。
4 5 3 2 5 1 0 0 0 0 0
計算量
時間計算量: 配列を一度だけ走査するため O(n) です。
空間計算量: 追加のメモリを使用しないため O(1) です。
-
【C++】配列内のすべての素数の積を求める方法
整数型配列 arr[] が与えられたとき、その配列に含まれるすべての素数を見つけ出し、それらの積を計算するのが本記事のテーマです。素数とは、1とその数自身でしか割り切れない正の整数のことです。たとえば、2、3、5、7、11などが素数に該当します。それでは、次の配列を例に解を求めてみましょう。入力: arr[] = { 11, 20, 31, 4, 5, 6, 70 }出力: 1705説明: 配列内の素数は 11、31、5 の3つであり、その積は 11 × 31 × 5 = 1705 となります。入力: arr[] = { 1, 2, 3, 4, 5, 6, 7 }出力: 210説明: 配列内の
-
Pythonのリスト内包表記でリスト内のすべての0を末尾に移動する方法
Pythonでは、リスト内包表記を使うことで、数値リスト内のすべての0(ゼロ)をリストの末尾に移動できます。例えば、[1, 3, 0, 4, 0, 5, 6, 0, 7] というリストの場合、処理後の結果は [1, 3, 4, 5, 6, 7, 0, 0, 0] となります。 リスト内包表記を活用すれば、この処理はわずか1行のコードで実現可能です。以下の手順に従って実装してみましょう。 処理の手順 数値のリストを初期化します。 リスト内包表記で「0以外の要素」と「0の要素」をそれぞれ抽出し、両者を連結して新しいリストを作成します。 新しいリストを出力して結果を確認します。 サンプルコード