-
C++でO(1)の追加メモリを使い、arr[i]をarr[arr[i]]になるように配列を並べ替える方法
正の整数型の配列 arr[] が与えられます。配列のサイズは任意ですが、すべての要素は 0 以上かつ配列のサイズ未満である必要があります。この課題の目的は、O(1) の追加メモリ領域しか使わずに、arr[i] が arr[arr[i]] となるように配列を再配置し、その最終結果を出力することです。 入出力シナリオの例 入力 − int arr[] = {0, 3, 2, 1, 5, 4} 出力 −並べ替え前の配列: 0 3 2 1 5 4O(1) の追加メモリで arr[i] を arr[arr[i]] に並べ替えた結果: 0 1 2 3 4 5 説明 − サイズ 6 の整数配列が与えられ、す
-
C++でarr[i]がjの場合、arr[j]がiとなるように配列を再配置する方法
ここでは、正の整数型の配列 arr[](任意のサイズ)が与えられます。配列内の各要素は、0以上かつ配列のサイズ未満の値でなければなりません。この課題の目的は、「arr[i] の値が j であれば、arr[j] を i にする」という規則に従って配列を再配置し、その最終結果を出力することです。 入出力シナリオの例 入力 − int arr[] = {3, 4, 1, 2, 0} 出力 −再配置前の配列: 3 4 1 2 0「arr[i]がjならばarr[j]をiにする」ように再配置した配列: 4 2 3 0 1 説明 − サイズ5の整数配列が与えられ、すべての要素は5未満の値です。各要素の対応
-
C++でarr[i] = iとなるように配列を再配置する方法
任意のサイズの正の整数型配列 arr[] が与えられます。配列内の各要素は、0 より大きく配列のサイズ未満の値を持つものとします。ここでの課題は、配列を再配置することです。具体的には、インデックス i に対応する値 i が配列内に存在する場合は arr[i] = i とし、存在しない場合には arr[i] に -1 を設定した上で、最終的な結果を出力します。 入出力シナリオの例 入力 − int arr[] = {0, 8, 1, 5, 4, 3, 2, 9 } 出力 − arr[i] = i となるように再配置した配列: 0 1 2 3 4 5 -1 -1 説明 − サイズ 8 の整数配列
-
【C++】奇数インデックスの要素が前の要素より大きくなるように配列を再配置する方法
正の整数型の配列 arr[] が与えられます。この記事では、奇数インデックスに存在するすべての要素が、直前の偶数インデックスの要素よりも大きくなるように配列を再配置し、その結果を出力する方法を解説します。 入出力シナリオの例 入力 − int arr[] = {2, 1, 5, 4, 3, 7, 8} 出力 −整列前の配列: 2 1 5 4 3 7 8奇数インデックスの要素がすべて前の要素より大きくなるように再配置した結果: 1 4 2 5 3 8 7 説明 − サイズ7の整数配列が与えられています。偶数インデックスの要素の方が大きい場合には、偶数インデックスの要素と奇数インデックスの要素を交
-
C++で配列を並べ替えて隣接ペア要素の積の合計を最小化する方法
正の整数型の配列 arr[](任意のサイズ)が与えられたとします。課題は、配列をうまく並べ替え、隣り合う2つの要素同士を掛け合わせた積を順番に足し合わせたとき、その合計が最小になるようにすることです。入出力シナリオの例入力 − int arr[] = {2, 5, 1, 7, 5, 0, 1, 0}出力 − 隣接ペア要素の積の合計が最小値(7)となるように並べ替えた配列: 7 0 5 0 5 1 2 1説明 − サイズ8の整数配列が与えられています。これを「7 0 5 0 5 1 2 1」のように並べ替えると、合計は 7 × 0 + 5 × 0 + 5 × 1 + 2 × 1 = 0 + 0
-
C++でO(1)の追加メモリを使って配列の正と負の要素を交互に並べ替える方法
正の数と負の数が混在する整数型の配列 arr[] が与えられたとき、正の数が負の数に挟まれる形で交互に並ぶように配列を並べ替えるのが本記事の課題です。どちらかの符号の要素が余った場合は、それらは配列の末尾にまとめて配置されます。ここでは、O(1)の追加メモリ(定数個の補助変数のみ)でこの処理を実現する方法を解説します。 入出力シナリオの例 入力 − int arr[] = {-1, -2, -3, 1, 2, 3} 出力 − 並べ替え前の配列:-1 -2 -3 1 2 3O(1)の追加メモリで正負の要素を交互に並べ替えた結果:-1 1 -2 2 -3 3 説明 − サイズ6の整数配列に正と負
-
C++で偶数インデックスの要素が小さく、奇数インデックスの要素が大きくなるように配列を再配置する方法
正と負の両方の数値を含む整数型配列 arr[] が任意のサイズで与えられます。この課題では、偶数番目のインデックスにあるすべての要素が、隣接する奇数番目のインデックスの要素よりも小さくなるように配列を再配置し、その結果を出力することが求められます。このような並びは「波状(ウェーブ)パターン」とも呼ばれ、1回の走査で O(n) の計算量を実現できる効率的な手法として知られています。入出力シナリオの例入力 − int arr[] = {2, 1, 4, 3, 6, 5, 8, 7}出力 − 整理前の配列:2 1 4 3 6 5 8 7偶数インデックスの要素が小さく、奇数インデックスの要素が大きくな
-
【C++】偶数番目の要素が奇数番目より大きくなるように配列を再配置する方法
正と負の整数を含む整数型配列 arr[] が与えられます。この課題では、配列を再配置して、偶数番目(インデックス)に位置するすべての要素が、奇数番目に位置する要素よりも常に大きくなるようにし、その結果を出力します。 入出力シナリオの確認 入力 − int arr[] = {2, 1, 4, 3, 6, 5, 8, 7} 出力 − 再配置前の配列: 2 1 4 3 6 5 8 7偶数番目の要素が奇数番目より大きくなるように再配置した結果: 1 8 2 7 3 6 4 5 説明 − サイズ8の整数配列が与えられています。まず配列を昇順にソートし、その後、最小値側と最大値側から交互に要素を取り出し
-
C++でO(n)時間・O(1)の追加メモリで正負の数を交互に並べ替える方法
本記事では、正の数と負の数が混在した整数型配列 arr[] を扱います。目標は、この配列を正の数と負の数が交互に配置されるように並べ替えることです。どちらか一方の符号の要素が余った場合は、それらを配列の末尾にまとめて配置します。ここで重要なのは、計算量を O(n) 時間、追加メモリを O(1)(つまり定数個の補助変数のみ)に抑えた実装を行う点です。入出力のシナリオ例入力: int arr[] = {4, 2, -1, -1, 6, -3}出力: O(n) 時間・O(1) の追加メモリで並べ替えた結果: 2 -1 6 -1 4 -3説明: サイズ6の整数配列には正と負の要素が混在しています。並べ
-
C++の組み込みsort関数を使って正負の数値を並べ替える方法
正の数と負の数が混在する整数型配列 arr[](任意のサイズ)が与えられます。この記事では、C++ STLの組み込みsort関数を使用する方法と、再帰的なコーディング技法を使用する方法の2通りで配列を並べ替え、その結果を出力する方法を解説します。 入出力シナリオの例 入力 − int arr[] = {4, 2, -1, -1, 6, -3, 0} 出力 − 組み込みsort関数を使用した正負の数値の並べ替え結果: -3 -1 -1 0 2 4 6 説明 − 正と負の要素を含むサイズ7の整数配列が与えられています。すべての負の要素が正の要素より前に来るように配列を並べ替えると、最終結果は「-3
-
C++で定数の追加メモリ(O(1))を使って正数と負数を再配置する方法
問題の概要 正の数と負の数が混在する整数型配列 arr[](サイズは任意)が与えられたとします。この課題では、定数の追加メモリ領域(O(1))のみを使用して、負の数を配列の前半に、正の数と 0 を後半に集めるように配列を並べ替えます。本記事では、C++ による実装方法と、その実行結果の出力までをわかりやすく解説します。 入出力シナリオの例 入力 − int arr[] = {4, 2, -1, -1, 6, -3, 0} 出力 − 定数の追加メモリで正数と負数を再配置した結果:-3 -1 -1 0 6 2 4 説明 − サイズ 7 の整数配列には正と負の両方の要素が含まれています。定数の追加メ
-
C++で最初のN個の数字をKの距離になるように並べ替える方法
問題概要 整数 N と K が与えられたとき、まず 1 から N までの順列を作成し、その後、すべての要素が元の位置からちょうど K だけ離れるように並べ替えることを考えます。 入出力のシナリオ例 入力 − int n = 20, int k = 2 出力 − 最初のN個の数字をK距離に並べ替えた結果: 3 4 1 2 7 8 5 6 11 12 9 10 15 16 13 14 19 20 17 18 説明 − 整数 N = 20、K = 2 が与えられています。まず順列 1, 2, 3, ..., 20 を作成し、続いて各要素が元の位置からちょうど「k」の距離に配置されるように並べ替え
-
C++で配列を昇順にソートし、奇数と偶数の値を交互に並べ替える方法
正と負の両方の数を含む整数型の配列 arr[](任意のサイズ)が与えられたとします。この課題は、配列を次のようなルールで並べ替えることです。配列内の最小の要素が奇数である場合、要素は「奇数が先・偶数が後」の交互パターンで並べ替えられます。最小の要素が偶数である場合は、「偶数が先・奇数が後」の交互パターンで並べ替えられます。さらに、偶数(または奇数)の要素数が奇数(または偶数)の要素数より多い場合、余った位置には 0 を配置して結果を出力します。 入出力シナリオの例 入力 − int arr[] = { 1, 1, 2, 2, 5, 4 } 出力 − 昇順に奇数と偶数の値を交互に並べ替えた結果:
-
C++で文字を並べ替えて回文を形成する方法
任意の長さの文字列「str」が与えられたとき、入力文字列から文字を追加・削除することなく、出力が回文(パリンドローム)となるように文字を並べ替えることが課題です。回文とは、前から読んでも後ろから読んでも同じ発音・同じ並びになる文字列のことを指します。入出力シナリオの例入力 − string str = itnin出力 − 回文を形成できる場合の文字の並べ替え結果:nitin説明 − 文字列型変数 str が与えられています。入力文字列の文字を回文となるように並べ替え、不可能な場合は「NOT POSSIBLE」を返します。この入力文字列の場合、出力は「nitin」となります。入力 − strin
-
C++で元の数でも割り切れる数字の並べ替えを実装する方法
整数型の数値(ここでは number と呼びます)が与えられます。この課題は、number の各桁を並べ替えて新しい数を作り、その並べ替え後の数が元の number でも割り切れるようにするというものです。 入出力シナリオの例 入力 − int number = 100035 出力 − 元の数で割り切れる並べ替え後の数値:300105 説明 − 整数 number として 100035 が与えられています。これらの桁を並べ替えて、元の数 100035 で割り切れる数を作る必要があります。桁を並べ替えた結果、100035 で割り切れる 300105 が得られました。 入力 − int numb
-
C++で文字列を並べ替えて回文部分文字列の数を最大化する方法
任意の長さの文字列 str が与えられたとき、入力文字列から文字を追加・削除することなく、回文となっている部分文字列の数が最大になるように文字を並べ替えるのが本記事の課題です。回文とは、先頭から読んでも末尾から読んでも同じ並び・同じ読み方になるように文字が配置された文字列のことを指します。 入出力シナリオ まず、いくつかの入出力パターンを見てみましょう。 例 1 入力:string str = itnin 出力:回文部分文字列の数を最大化するための文字列の並べ替え結果は「iinnt」です。 解説:文字列型変数 str が与えられています。入力文字列の各文字を、回文となる部分文字列の数が最大に
-
C++でソースコードを読みやすく整形・再配置する方法
文字列型の変数 str にソースコードを格納し、その文字列の長さを計算して関数に渡します。この記事の課題は、与えられたソースコードを整形(再配置)し、適切な改行を加えた読みやすい形式で結果を出力することです。 入出力シナリオの確認 入力 − string str = "#include <bits/stdc++.h> using namespace std; int main()" "{ int sum, first, second; sum = first + second; printf(\"%d\", c);&qu
-
C++で再帰関数を使って文字列が回文かどうかを判定する方法
入力として文字列 Str が与えられます。目的は、再帰関数を使用して、入力された文字列が回文(パリンドローム)であるかどうかを判定することです。回文とは、前から読んでも後ろから読んでも同じ言葉になる文字列のことです。長さが0の文字列も回文とみなされます。回文を文字単位で逆順に並べ替えても、元の文字列とまったく同じ文字列になります。回文の例としては、madam、abcba、malayalam などが挙げられます。実行例入力 − Str = malayalam出力 − 入力文字列は回文です。説明 −Str[0〜8] = malayalam逆順にした Str[8〜0] = malayalam両者の文
-
C++による再帰的挿入ソートの解説と実装例
挿入ソート(Insertion Sort)は、トランプの手札を並べ替えるように、要素を適切な位置へ挿入しながらデータを整列させるソートアルゴリズムの一つです。すべての要素を左から右へ順に走査し、最初の要素を「すでにソート済み」とみなします。その後、残りの要素を1つずつ取り出し、左側のソート済みリストの中で正しい位置に挿入していきます。各要素は、自分より小さい(または等しい)要素が見つかるまで、左側の要素と順番に比較されます。 挿入ソートのアルゴリズム int arr[5] = { 5,4,2,1,3 }; int i, j; インデックス j = i+1 から j < 配列サイズ まで走査し
-
C++で再帰関数を使って部分文字列を検索・判定する方法
2つの文字列 Str と subStr が入力として与えられます。この問題の目的は、subStr に含まれるテキストが Str の中に部分文字列として存在するかどうかを判定することです。文字列 X が文字列 Y の中に全体として少なくとも1回出現するとき、X は Y の部分文字列と呼ばれます。 本記事では、再帰的なアプローチを用いてこの問題を解く方法を解説します。 実行例 入力 − Str = 「tutorialspoint」、subStr = 「Point」 出力 − 与えられた文字列に部分文字列は含まれていません! 説明 − 文字列「Point」は「tutorialspoint」の部分文