C++

 Computer >> コンピューター >  >> プログラミング >> C++
  1. C++で二分木の特定ノードから距離Kにあるすべてのノードを出力する方法

    問題の概要本記事では、二分木・ターゲットノード・整数Kが与えられたとき、ターゲットノードから距離Kにあるすべてのノードを出力するアルゴリズムをC++で実装して解説します。二分木(Binary Tree)とは、各ノードが最大2つの子ノード(0個・1個・2個)を持つことができる特殊な木構造です。問題例まず、具体例を使って問題を理解しましょう。下図のような二分木を考えます。K = 2ターゲットノード: 9出力:5 1 3説明:ここでいう「距離」は、ターゲットノードより上の階層・下の階層・同じ階層のいずれのノードに対しても定義されます。そのため、方向を問わず距離Kにあるノードをすべて出力する必要があり

  2. C++でn桁の厳密に増加する数をすべて出力する方法

    この問題では、数値Nが与えられ、最上位桁(MSB)から最下位桁(LSB)にかけて各桁が厳密に増加しているすべてのn桁の数を出力することが求められます。つまり、左側の桁は必ずその右隣の桁より小さくなければなりません。 問題例 入力: n = 2 出力: 01 02 03 04 05 06 07 08 09 12 13 14 15 16 17 18 19 23 24 25 26 27 28 29 34 35 36 37 38 39 45 46 47 48 49 56 57 58 59 67 68 69 78 79 89. 解説: 出力結果を見ると、どの数も左側の桁が右側の桁よりも小さくなっている

  3. C++で偶数の位と奇数の位の合計の絶対差が1となるn桁の数をすべて出力する方法

    問題の概要この問題では、整数 n が与えられ、「偶数の位にある桁の合計」と「奇数の位にある桁の合計」の絶対差が 1 となるすべての n 桁の数を出力することが求められます。なお、数を生成する際に先頭の 0 は考慮しません(先頭が 0 のものは n 桁の数として扱いません)。ここでいう絶対差とは、2つの値の差の絶対値(常に正の値)を意味します。具体例を使って、問題を理解しましょう。入力: n = 2 出力: 10 12 21 23 32 34 43 45 54 56 65 67 76 78 87 89 98 説明: 出力の中の数を例にとると、 54 の場合 → 偶数の位 − 奇数の位 = 5 −

  4. C++で桁の合計が指定した値と一致するすべてのn桁の数を出力する方法

    この問題では、2つの整数 n と sum が与えられます。求めるのは、各桁の数字の合計が sum と一致するすべての n 桁の数です。なお、先頭に 0 が付く数(例:014 など)は n 桁の数として扱いません。 問題の例 具体的な例を見てみましょう。 入力: n = 2 , sum = 5 出力: 14 23 32 41 50 説明: 出力されたすべての数は、各桁の合計が 5 になっています。 解決のアプローチ この問題を解くには、条件を満たす n 桁の数をすべて列挙する必要があります。そこで再帰的な手法を用います。まず最上位の桁に 1〜9 の値を順に固定し(先頭の 0 を除外するため)、

  5. C++でモバイルキーパッドから生成できるすべてのn桁パターンを出力する方法

    問題の概要この問題では、整数 n が与えられ、モバイルキーパッドのボタンを押すことで形成できるすべてのn桁のパターンを出力することが求められます。ただし、ボタンを押す際には、現在押しているボタンの隣接するボタン(左・右・上・下)しか押せないという制約があります。従来のモバイルキーパッドの配置12ABC3DEF4GHI5JKL6MNO7PQRS8TUV9WXYZ*0#入力例と出力例具体的な例を見て、問題を理解しましょう。入力: n = 2出力: 12 14 21 23 25 32 36 41 45 47 52 54 56 58 63 65 69 74 78 85 87 89 80 96 98n

  6. C++でN以下の乗法的素数をすべて出力する方法

    この記事では、整数 n が与えられたときに、n 以下のすべての乗法的素数(マルチプリカティブ素数)を見つけて出力する方法を、C++のコード例とともにわかりやすく解説します。 乗法的素数とは? 乗法的素数とは、「各桁の数字の積もまた素数になる」という性質を持つ素数のことです。たとえば、2、3、5、7、13、17 などが該当します。 一方で、23 は素数ではありますが、各桁の積が 2 × 3 = 6 となり素数ではないため、乗法的素数には分類されません。 問題例 入力: n = 9 出力: 2 3 5 7 解き方のアプローチ この問題は、次の手順で効率的に解くことができます。 素数の列挙: エラ

  7. C++でDFSを使ってn分木のすべての葉ノードを出力する方法

    問題の概要 この問題では、n分木(n-ary tree)の辺情報を格納した2次元配列が与えられます。配列の各要素は木の辺を表しており、この配列から構成されるn分木のすべての葉ノード(リーフノード)を出力することが求められます。 n分木とは、各ノードが最大でn個の子を持つことができる木構造のことです。つまり、あるノードは1個、2個……n個までの子ノードを持つ可能性があります。 入出力例 Input: edge[][] = {{5,8}, {5,6}, {8,1}, {8,4}, {6,7}} Output: 1 4 7 解説 − 辺配列をもとに木を構築すると、次のような構造になります。 この

  8. C++で二分木のすべての葉ノードを右から左の順に出力する方法

    問題概要この記事では、二分木(binary tree)が与えられたとき、そのすべての葉ノード(リーフノード)を右から左の順で出力する方法を解説します。まず、具体例を使って問題を確認しましょう。入力例出力例7 4 1この問題を解くには、二分木を走査(トラバース)する必要があります。走査のアプローチは主に次の2つがあります。方法1:前順走査(Preorder Traversal)+ 再帰前順走査は再帰を用いた手法で、通常は「根 → 左部分木 → 右部分木」の順にノードを訪問します。ただし今回は右から左へ出力する必要があるため、再帰呼び出しの順序を「右部分木 → 左部分木」にするのがポイントです。葉

  9. C++の反復アプローチで二分木の全リーフノードを左から右へ出力する方法

    この記事では、二分木が与えられたときに、そのすべての葉ノード(リーフノード)を左から右の順に出力する方法を解説します。 問題の理解 まず、具体例を使って問題を確認しましょう。 入力 − 出力 − 1 4 7 上図の二分木では、子を持たないノードである「1」「4」「7」が葉ノードに該当し、左から右の順に出力されます。 解決アプローチ この問題を反復的なアプローチで解くには、深さ優先探索(DFS)を利用します。木の走査は根ノードから開始し、各ノードに対して以下の手順を実行します。 そのノードが葉ノード(左右どちらの子も持たないノード)であれば、データを出力します。 葉ノードでない場合は、まず左

  10. C++で二分木内の合計がKとなるすべてのパスを出力する方法

    この問題では、二分木と数値Kが与えられ、パス上のノード値の合計がKに等しくなるような、木の中のすべてのパスを出力することが求められます。ここでいうパスとは、木の任意のノードから始まり、任意のノードで終わることができるものです。ただし、パスは必ず親ノードから子ノードへ向かう(下向きの)方向である必要があります。また、ノードの値は正・負・ゼロのいずれであっても構いません。具体例を使って問題を理解しましょう。K = 5 の場合出力:1 3 1 3 2 1 4解き方のアプローチこの問題を解くためには、各ノードを一時的な根(ルート)として扱い、そこから下方向へ伸びる経路のうち、ノード値の合計がKになるも

  11. C++でN以下のジャンピングナンバーをすべて出力する方法

    この記事では、与えられた数値 n 以下のジャンピングナンバー(Jumping Numbers)をすべて出力するC++プログラムを紹介します。 ジャンピングナンバーとは? ジャンピングナンバーとは、隣り合う桁どうしの差が必ず「1」になっている数のことです。例えば、4565、98、7 などが該当します。 すべての1桁の数字(0〜9)は、ジャンピングナンバーとみなされます。 235 のように、隣接する桁の差が1以外になる箇所がある数は、ジャンピングナンバーではありません。 問題の例 具体的な入力と出力の例を見てみましょう。 入力: N = 32 出力: 0 1 2 3 4 5 6 7 8 9

  12. C++で二分木のすべての内部ノードを出力する方法

    この記事では、与えられた二分木からすべての内部ノードを見つけて出力する方法を解説します。 二分木と内部ノードとは 二分木(バイナリツリー)とは、各ノードが最大2つの子ノードを持つことができる木構造のデータ構造です。ノードは子をまったく持たないこともあれば、1つだけ持つこと、2つ持つこともあります。 内部ノードとは、少なくとも1つの子ノードを持つノードのことを指します。言い換えると、葉ノード(子を持たないノード)以外のノードがすべて内部ノードです。 具体例 次のような二分木を考えてみましょう。 この木の場合、子ノードを持っているのは 7、4、9 の3つのノードなので、出力は以下のようになります

  13. C++で2つの文字列から生成できるすべてのインターリービング文字列を出力する方法

    問題の概要この問題では、2つの文字列 str1 と str2 が与えられ、これらの文字列から作成できるすべてのインターリービング文字列(交互結合文字列)を出力することが求められます。インターリービング文字列とは?インターリービング文字列とは、与えられた2つの文字列の文字を交互に組み合わせて作られる文字列のことです。重要なポイントとして、各文字列内の文字の相対的な順序は維持される必要があります。具体例で問題を確認してみましょう。入力: str1 = XY、str2 = NS 出力: XYNS, XNYS, XNSY, NXYS, NXSY, NSXY上記の出力結果を見ると、どの文字列でも「X」は

  14. C++で指定した2つの数の累乗の和として表せるすべての整数を出力する方法

    問題の概要この問題では、2つの数 a と b、および整数 bound が与えられます。そのうえで、bound 以下の値のうち、a と b の累乗の和として表せるすべての値を出力することが求められます。数式で表すと、以下の条件を満たす値をすべて求めることになります。Bound >= ai + bj問題を理解するための例入力: a=2, b=3, bound=8出力: 2 3 4 5 7この例では、bound=8 以下で 2i + 3j の形で表せる値は、2(=20+30)、3(=21+30)、4(=20+31)、5(=21+31)、7(=22+31) となります。解法のアプローチこの問題を

  15. C++で最初のn個の自然数から長さkの増加列をすべて出力する方法

    この問題では、2つの整数 K と n が与えられます。求められているのは、最初の n 個の自然数を使って作れる長さ K の増加列をすべて出力することです。増加列とは増加列(増加シーケンス)とは、隣り合う要素において、次の要素の値が必ず前の要素より大きくなっている数列のことです。具体例で問題を確認してみましょう。入力:n = 4, K = 2 出力: 1 2 1 3 1 4 2 3 2 4 3 4解法のアプローチこの問題は、バックトラッキング(再帰)を使うことで効率的に解けます。基本的な考え方は以下の通りです。現在生成中のシーケンスを保持するための、長さ k の配列を用意します。配列の各位置につ

  16. C++で指定範囲内のすべての「良い数」を出力する方法

    この問題では、3つの整数 L・R・d が与えられます。目的は、L から R までの範囲内に存在する「良い数」のうち、いずれの桁にも d が含まれていない数をすべて出力することです。 良い数(Good Number)とは? 良い数とは、すべての桁において、その桁の数字が「自分より右側(下位)の桁の数字の合計」より大きくなっている数のことです。例えば 732 は良い数です。7 > 3+2 であり、3 > 2 という条件がどちらも満たされているからです。 問題例 入力:L = 400 , R = 500 , d = 3 出力:410, 420, 421 説明:400〜500 の範囲に

  17. C++で文字列内のすべての「面白い単語(ファニーワード)」を出力する方法

    この記事では、与えられた文の中から「面白い単語(ファニーワード)」に該当するすべての文字列を検出し、出力するC++プログラムを解説します。面白い単語とは?「面白い単語」とは、次の条件を満たす単語のことです。つまり、元の文字列の隣接する文字同士の絶対差が、逆順にした文字列の隣接する文字同士の絶対差と等しいという条件です。|string[0] - string[1]| = |revstring[0] - revstring[1]|具体例で理解しよう実際の例を見てみましょう。入力: string = ABRS 出力: Yes 解説: 逆順の文字列 = SRBA |A-B| = 1 = |S-R| |

  18. C++で二分木のすべての完全ノード(フルノード)を出力する方法

    この記事では、二分木が与えられたときに、その木に含まれるすべての完全ノード(フルノード)を見つけて出力する方法を解説します。 二分木と完全ノードとは? 二分木(バイナリツリー)とは、各ノードが最大2つの子ノードを持つことができる木構造のことです。子ノードは0個(葉)、1個、または2個のいずれかになります。 完全ノード(フルノード)とは、左の子と右の子の両方を持っているノードのことを指します。言い換えれば、左右どちらか一方しか子を持たないノードや、子をまったく持たないノードは完全ノードではありません。 具体例 次のような二分木を考えてみましょう。 100 / \

  19. C++で二分探索木の偶数ノードをすべて出力する方法

    この記事では、二分探索木が与えられたときに、その中から偶数の値を持つノードをすべて出力する方法を解説します。二分探索木とは二分探索木(BST: Binary Search Tree)は、以下の条件を満たす二分木です。左側の部分木には、常に親ノードより小さい値を持つノードが含まれる。右側の部分木には、常に親ノードより大きい値を持つノードが含まれる。すべてのノードが上記の2つのルールに従っている必要がある。これらの性質により、二分探索木では効率的な検索・挿入・削除が可能になります。問題の例具体例を使って問題を理解しましょう。例えば、次のような二分探索木を考えます。出力: 2 4 6 8解法のアプロ

  20. 【C++】重複する文字を含む文字列のすべての異なる順列を出力する方法

    この問題では、重複する文字を含む可能性のある文字列が与えられます。求められているのは、その文字列から作られるすべての異なる順列(重複を除いた並べ替え)を出力することです。 問題の例 まず、具体的な入出力例を見てみましょう。 入力:string = XYZ 出力:XYZ XZY YXZ YZX ZYX ZXY 解き方の考え方 この問題を解くには、一つの要素を固定しながら残りの要素を入れ替えていく、いわゆる「辞書順に次の順列を生成する」アルゴリズムが有効です。大まかな流れは以下のとおりです。 文字列全体を昇順にソートします。これが最初の(辞書順で最も小さい)順列になります。 現在の順列を出力

Total 5990 -コンピューター  FirstPage PreviousPage NextPage LastPage CurrentPage:125/300  20-コンピューター/Page Goto:1 119 120 121 122 123 124 125 126 127 128 129 130 131