C++で配列の先頭にあるゼロ(先行ゼロ)を削除する方法
この記事では、与えられた配列から先頭のゼロ(先行ゼロ)を取り除き、その結果を出力する方法を解説します。
問題の概要
たとえば、次のような入力と出力を考えます。
入力 : arr[] = {0, 0, 0, 1, 2, 3}
出力 : 1 2 3
入力 : arr[] = {0, 0, 0, 1, 0, 2, 3}
出力 : 1 0 2 3ご覧のとおり、配列の途中にあるゼロはそのまま残し、先頭に連続して並ぶゼロだけを削除するのがポイントです。
解決のアプローチ
基本的な方針はシンプルです。配列を先頭から走査し、最初の「ゼロではない要素」の位置を見つけることで、そこより前のゼロをすべて除外した新しい配列を作成します。
手順を整理すると以下のようになります。
1. 配列を左から順に調べ、最初の非ゼロ要素のインデックスを記録する
2. 非ゼロ要素が1つも存在しない場合は「Empty」などを出力して終了する
3. 見つかったインデックス以降の要素だけを新しい配列へコピーする
4. 新しい配列の内容を出力する
C++での実装例
#include <iostream>
using namespace std;
int main() {
int arr[] = {0, 0, 0, 1, 2, 0, 4};
int n = sizeof(arr) / sizeof(int); // 配列のサイズを求める
int last = -1;
for(int i = 0; i < n; i++) { // 最初の非ゼロ要素を探す
if(arr[i] != 0) {
last = i;
break;
}
}
if(last == -1)
cout << "Empty\n";
else {
int b[n - last]; // 新しい配列
for(int i = last; i < n; i++) // 新しい配列に要素を挿入
b[i-last] = arr[i];
for(int i = 0; i < n-last; i++) // 配列を出力
cout << b[i] << " ";
}
}実行結果
1 2 0 4
コードの解説
このプログラムでは、まず配列 arr を先頭から走査し、最初の非ゼロ要素のインデックスを探して変数 last に格納しています。もし走査が終わっても last が -1 のままなら、配列全体がゼロで構成されていることを意味するため、「Empty」と出力します。
一方、最初の非ゼロ要素のインデックスが分かれば、新しい配列のサイズは (n - last) と計算できます。あとは last から n 未満まで for ループを回し、該当する要素を新しい配列 b にコピーして出力すれば、先頭のゼロが取り除かれた配列が得られます。
計算量について
このアルゴリズムは配列を最大2回走査するだけなので、時間計算量は O(n)、追加で必要なメモリも新しい配列分の O(n) となります。非常に効率的な方法です。
まとめ
この記事では、配列から先頭のゼロを削除する問題を取り上げました。最初の非ゼロ要素の位置さえ特定できれば、あとはその位置以降の要素をコピーするだけで簡単に実現できることが分かりました。同じロジックは C、Java、Python など他の言語でも同様に実装できます。ぜひ参考にしてみてください。
-
C#で文字列から先頭のゼロを削除する方法
文字列の先頭に余分なゼロが付いていると、数値として扱う際やデータの整形時に不便なことがあります。例えば、次のような先頭にゼロが付いた文字列を考えてみましょう。 String str = 000234; このような先頭ゼロを削除するには、C#のTrimStart()メソッドを使用します。引数として、削除したい文字(ここでは「0」)をChar型の配列で指定します。 TrimStart(new Char[] { 0 } ) TrimStart()メソッドは、指定した文字が続く限り、文字列の先頭から順番に削除していきます。そのため、「000234」のように複数のゼロが連続していても、すべての先頭ゼロ
-
PythonでIPアドレスの先頭ゼロを削除する方法を解説
このチュートリアルでは、IPアドレスから先頭の余分なゼロ(先行ゼロ)を削除するPythonプログラムを作成します。具体的には、255.001.040.001 のようなIPアドレスを 255.1.40.1 の形式に変換する処理を実装していきます。 処理の流れ 以下の手順に沿ってプログラムを組み立てます。 対象となるIPアドレスを文字列として初期化する split() 関数を使い、ピリオド(.)でIPアドレスを分割する 分割した各部分を int 型に変換する(数値化することで先頭のゼロが自動的に除去される) 結合できるように、各部分を再び str 型に戻す join() メソッドですべての部分を