C++で連続する文字を同じ行にまとめて出力する方法
この問題では、文字列が与えられ、連続する文字(アルファベット順で隣り合う文字)が2つ以上続く場合はそれらを同じ行にまとめて出力し、連続していない場合は改行して別の行に出力する必要があります。
まず例を見ながら、この概念をより深く理解しましょう。
入力 : abcxstk 出力 : abc x st k
解説 − 「abc」は連続しているため、1行に出力されます。次の「x」は連続していないため、ここで改行が入ります。次の「s」は「x」と連続していないため、改行して出力します。次の「t」は「s」と連続しているため、続けて出力されます。最後の「k」は「t」と連続していないため、改行して出力します。
この問題の解き方はシンプルです。文字列内の各文字を直前の文字と比較します。両者が連続している(文字コードの差が±1である)場合はそのまま出力し、そうでない場合は改行を挿入してから出力します。
実装例
それでは、このロジックに基づいてプログラムを作成してみましょう。
#include <iostream>
using namespace std;
int main(){
string str = "stukfrpq";
cout << str[0];
for (int i=1; str[i]!='\0'; i++){
if ((str[i] == str[i-1]+1) || (str[i] == str[i-1]-1))
cout << str[i];
else
cout << "\n" << str[i];
}
return 0;
}出力結果
stu k f r pq
このプログラムでは、最初の文字を出力した後、2文字目以降を順番にチェックしていきます。現在の文字が前の文字と連続している場合はそのまま出力し、連続していない場合は改行コードを出力してから文字を出力します。これにより、連続する文字だけが同じ行にまとまって表示されます。
-
C++で二分木を見やすい形式で2次元配列に出力する方法
本記事では、二分木(バイナリツリー)を m×n の2次元文字列配列として整形して出力する方法を解説します。出力には以下のルールが適用されます。行数 m は、与えられた二分木の高さと一致すること。列数 n は、必ず奇数になること。ルートノードの値は、最初の行のちょうど中央に配置する。ルートノードが存在する行と列によって、残りの領域は「左下」と「右下」の2つの部分に分割される。左側の部分木は左下の領域へ、右側の部分木は右下の領域へそれぞれ出力する。左右の領域は同じサイズとする。片方の部分木が存在しない場合でも、何も出力はしないものの、もう一方の部分木と同じサイズの領域は確保しておく必要がある。ただ
-
C++で二分木のレベル順走査(幅優先探索)を行ごとに出力する方法
二分木が与えられたとき、そのレベル順走査(幅優先探索)の結果を、レベル(行)ごとに表示する関数をC++で実装します。 レベル順走査とは、木の最上位(ルート)から開始し、同じ深さにあるノードを左から右へ順に訪問していく手法です。上の階層から下の階層へと処理を進め、各レベルの出力を1行として表示していきます。 問題の例 例として、次のような二分木を考えてみましょう。 3 / \ 2 1 / \ \ 10 20 30 この二分木に対してレベル順走査を行うと、次のような出力が得られます。 Level 0: