配列から「1・2・3」をすべて含む数値を昇順で出力する方法【C++】
この記事では、配列内の数値のうち、各桁に「1」「2」「3」をすべて含む数値だけを抽出し、昍順に出力する方法を解説します。該当する数値がひとつも存在しない場合は、-1 を出力します。
入力 : arr[] = {320,123,124,125,14532,126,340,123400,100032,13,32,3123,1100}
出力 : 123 3123 14532 100032 123400この配列には「1」「2」「3」をすべて含む数値が複数存在するため、-1 は返されず、これらの3つの数字をすべて含む 5 つの値が出力されます。
アルゴリズム
処理の手順は以下のとおりです。
開始
ステップ1 → int 型の要素を持つ配列 arr を宣言する
ステップ2 → 配列のサイズを int 型変数 n に格納する
ステップ3 → int 型変数 one、two、three を宣言する
ステップ4 → sort 関数を引数 arr と arr+n を指定して呼び出す
ステップ5 → ostringstream 型の変数 st と string 型変数 num を宣言する
ステップ6 → i = 0 から n 未満の間、++i でループ処理を行う
one = two = three = -1 を設定
arr[i] を st に書き込む
num = st.str() を設定
one = num.find("1") を設定
two = num.find("2") を設定
three = num.find("3") を設定
IF ((one != -1) && (two != -1) && (three != -1))
num を出力する
End
st.str("") を呼び出して文字列を初期化する
end
終了仕組みのポイント
まず sort() 関数で配列を昍順にソートすることで、結果が小さい数値から順に出力されるようになります。その後、各数値を ostringstream を使って文字列に変換し、string::find() メソッドで「1」「2」「3」のそれぞれが文字列中に存在するかを判定します。find() は該当する文字が見つかった場合にその位置を、見つからなかった場合は -1 を返すため、3つすべての戻り値が -1 以外であれば、その数値には「1」「2」「3」がすべて含まれていると判断できます。
実装例
#include <bits/stdc++.h>
#include<string.h>
#include<sstream>
using namespace std;
int main() {
int arr[] = {320,123,124,125,14532,126,340,123400,100032,13,32,3123,1100};
int n = sizeof(arr)/sizeof(arr[0]);
int one,two,three;
sort(arr, arr+n);
ostringstream st;
string num;
for (int i = 0; i < n; ++i) {
one=two=three=-1;
st << arr[i];
num=st.str();
one=num.find("1");
two=num.find("2");
three=num.find("3");
if((one!=-1)&&(two!=-1)&&(three!=-1)) {
cout<<num<<" ";
}
st.str("");
}
}出力
上記のプログラムを実行すると、次のような出力が得られます。
123 3123 14532 100032 123400
-
配列の左回転をO(n)時間・O(1)空間で実現するC++プログラムの書き方
本記事では、サイズnの整数配列と複数の回転位置kが与えられたとき、指定されたインデックスkから配列を左方向へ回転させた結果を出力する方法を、時間計算量O(n)・空間計算量O(1)の制約のもとで解説します。 配列の左回転とは、各要素を左へk個分ずらし、はみ出した要素を右端に折り返して配置する操作です。例えば、配列 {1, 2, 3, 4, 5} を1回左に回転すると {2, 3, 4, 5, 1} になります。 この手法の鍵となるのは剰余演算(%)です。回転後の配列を新たに作成することなく、インデックス計算だけで結果を直接出力できるため、追加のメモリ領域を一切必要としません。 入力例と出力例
-
C++プログラム:配列内の各要素の最後の出現を相対的な順序で出力する方法
配列 a[] が与えられたとき、リスト内の各要素について最後に出現したものだけを出力するのが本記事の目的です。ここでは単純に重複要素を削除するだけでなく、各要素が配列内で最後に出現したタイミングに基づき、元の相対的な順序を維持したまま出力する必要があります。例えば、6つの要素を持つ配列 {1, 3, 2, 3, 1, 2} には重複した値が含まれています。この場合、期待される結果は「3 1 2」になります。入力例と出力例Input: a[]={4,2,2,4,1,5,1} Output : 2 4 5 1この例では、「2」はインデックス2で最後に出現し、「4」はインデックス3、「5」はインデッ