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

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) です。

  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説明: 配列内の

  2. 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の要素」をそれぞれ抽出し、両者を連結して新しいリストを作成します。 新しいリストを出力して結果を確認します。 サンプルコード