C++

 Computer >> コンピューター >  >> プログラミング >> C++
  1. 【C++】双方向リンクリストから指定した値より大きいノードをすべて削除する方法

    このチュートリアルでは、C++を使って双方向リンクリスト( doubly linked list )から、指定された値より大きいデータを持つノードをすべて削除する方法を解説します。リンクリストの操作はデータ構造の基礎であり、ノードの挿入・削除のロジックを理解する絶好の題材です。問題を解く手順まずは、全体の流れを確認しましょう。データ本体(data)と前後へのポインタ(prev / next)を持つ構造体を定義します。双方向リンクリストの先頭にノードを挿入する関数を作成します。ダミーデータを使って双方向リンクリストを初期化します。リストを先頭から順に走査し、現在のノードのデータが指定値より大きい

  2. 【C++】連結リストからxより大きいノードをすべて削除する方法

    このチュートリアルでは、単方向連結リスト(Singly Linked List)から、指定した値 x より大きいデータを持つノードをすべて削除する方法 を解説します。まずは、問題を解くための手順を確認しましょう。解決の手順データ(data)と次ノードへのポインタ(next)を持つ構造体を定義します。連結リストにノードを挿入する関数を作成します。ダミーデータを使って連結リストを初期化します。連結リストを先頭から順に走査し、現在のノードのデータが x より大きいかどうかを判定します。x より大きい場合は、そのノードを削除します。ノード削除時に考慮すべき3つのケースノードを削除する関数では、以下の3

  3. 【C++入門】連結リストから交互のノードを削除する方法

    このチュートリアルでは、C++を使って単方向連結リスト(Singly Linked List)から交互のノードを削除する方法を解説します。 解決までの手順 全体の流れは以下の通りです。 データ(data)と次ノードへのポインタ(next)を持つ構造体を定義する 単方向連結リストにノードを挿入する関数を作成する ダミーデータで連結リストを初期化する 連結リストを先頭から順に走査する 直前のノード(prev)を保持しながら、交互のノードを削除していく ノード削除時に考慮すべき3つのケース ノードを削除する処理では、対象ノードの位置に応じて次の3つのケースを考慮する必要があります。 先頭ノード

  4. C++で配列がスタックソート可能かどうかを判定する方法

    1からnまでの一意な要素で構成される配列 nums があるとします。この配列が「スタックソート可能」であるかどうかを判定する必要があります。スタックソート可能とは、一時的なスタックを介して別の配列へ要素を移動させたとき、結果の配列が非減少順(昇順)に並べられることを指します。この問題を解くには、元の配列に対して次の2つの操作を任意の回数実行できます。配列の先頭要素を削除し、その要素をスタックにプッシュする。スタックのトップ要素を取り出し(ポップし)、2番目の配列の末尾に挿入する。これらの操作によって元の配列の全要素を2番目の配列へ移動でき、その結果が昇順にソートされていれば、元の配列はスタック

  5. C++で区間の集合の中に重なり合う区間が存在するかどうかを判定する方法

    あるイベントの開始時刻と終了時刻を表す値のペア(time1, time2)から構成される区間の集合が与えられたとします。ここでの課題は、この集合の中に他の区間と重なり合っている区間が存在するかどうかを確認することです。重なりが1つでも見つかれば True を返し、まったく重なりがなければ False を返します。例えば、入力が [(4,7), (5,11), (7,11), (5,8)] のような場合、出力は True になります。これは複数の区間が互いに重なっているためです。解決のアプローチこの問題は、以下の手順で効率的に解決できます。まず、入力リスト inputArr を開始時刻(time

  6. C++で無限に繰り返される文字列内の文字の出現回数をカウントする方法

    文字列 str、1つの文字、そして正の整数 N が与えられます。文字列 str は無限に繰り返されるものとします。ここでの目的は、繰り返しによって生成される文字列の最初の N 文字の中に、指定した文字が何回出現するかを求めることです。 たとえば、str が「abac」、対象の文字 ch が b、N が 10 である場合を考えてみましょう。 「abacabacabacabac……」の最初の 10 文字の中で、b は 2 回出現します。 注意:str と文字 ch は、大文字・小文字をそろえて扱ってください。 具体例で理解する 例 1 入力: str = TPTTTT ch = T n = 12

  7. C++で配列要素と指定した数値の平均の出現回数をカウントする方法

    問題の概要 整数要素を含む配列 arr[] と整数 num が与えられます。この問題の目標は、各要素 arr[i] と num の平均を求め、その平均値が元の配列 arr[] 内に何回出現するかをカウントして出力することです。 たとえば、配列 arr[] が [5, 2, 3]、num が 2 の場合、平均値は [3, 2, 2] となり、それぞれが arr[] 内に出現する回数は [1, 1, 1] になります。 入力例 1 arr[] = { 1, 6, 4, 3, 6, 4 }num = 2 出力例 1 1 2 1 0 2 1 ゼロ以外の出現回数を持つ要素の合計:5 説明 num

  8. ソート済み双方向連結リストで積が指定値xと等しくなるトリプルの個数を数えるC++プログラム

    問題の概要 整数値を格納したソート済みの双方向連結リスト(doubly linked list)が与えられます。この課題の目標は、3つのノードのデータの積が指定された値xと等しくなるようなトリプル(三つ組)の個数を求めることです。 例えば、入力リンクリストが「3→4→1→2」でxが6の場合、積が6になるトリプルは(3, 1, 2)の1つだけなので、カウントは1となります。 入力例と出力例 例1 入力: linked list: [ 200→4→16→5→10→10→2 ]、x = 200 出力: 積が指定値xと等しくなるトリプルの個数: 3 説明: 該当するトリプルは以下の3つです。 (4

  9. 【C++】ソート済み双方向連結リスト内で合計が指定値xと等しくなるトリプレットを数える方法

    問題の概要 整数値を格納したソート済みの双方向連結リスト(doubly linked list)が与えられます。この問題の目的は、リストから3つのノードを選んだとき、そのデータ値の合計が指定された値 x と一致するようなトリプレット(3つ組)が何通り存在するかを数えることです。 たとえば、連結リストが 3 → 4 → 1 → 2 で x = 6 の場合、条件を満たすのは (3, 1, 2) だけなので、答えは 1 となります。 入力例 1 linked list: [ 3 − 4 − 13 − 5 − 10 − 10 − 0 ] x = 20 出力 Count of triplets i

  10. C++で1を加算して末尾のゼロを削除し、Nから生成できる一意の数値の個数を数える方法

    整数 N が与えられます。N に対して次の 2 つの操作を繰り返し適用し、その過程で生成される一意の数値の個数を求めます。手順は以下のとおりです。数値に 1 を加算する生成された数値の末尾にあるゼロを削除する(存在する場合)たとえば N が 8 の場合、生成される数値は次のようになります。操作 1 を適用:8 → 9操作 2 を適用:9 に 1 を加えると 10 となり、末尾の 0 を削除して 1 になります操作 1 を適用:2 → 3 → 4 → 5 → 6 → 7 → 8(ここで元の数列に戻る)したがって、一意の数値の個数は 9 となります。入出力例例 1入力:N=21出力:Count o

  11. C++で指定範囲内のユーナリー数をカウントする方法

    2つの整数 start と end で表される範囲が与えられたとき、区間 [start, end] 内に存在する「ユーナリー数」の個数を求めるのが本記事の目的です。ユーナリー数とは、各桁の数字を2乗して合計する操作を繰り返したとき、最終的に 1 に到達できる数のことです(いわゆる「ハッピー数」と同じ性質を持つ数です)。 例として 13 という数を見てみましょう。 12 + 32 = 10 12 + 02 = 1 このように計算を繰り返して最終的な合計が 1 になるため、13 はユーナリー数です。 入力例と出力例 例1 入力: start=1 end=20 出力: 範囲内のユーナリー数の個数:

  12. 【C++】階乗の末尾に並ぶゼロの個数を効率的に求める方法

    整数を入力として与え、その数の階乗における末尾のゼロ(後続ゼロ)の個数を求めるのが本記事の目的です。ここで、ある数 N の階乗とは、1 から N までのすべての整数の積を指します。末尾のゼロが生まれる仕組み数の末尾にゼロが付くのは、その数が 10 の倍数である場合、すなわち因数として (2, 5) のペアを持つ場合だけです。5 より大きい任意の数の階乗を素因数分解すると、2 の個数は必ず 5 の個数よりも多くなるという性質があります。そこで、対象の数を 5 の累乗で順に割っていくことで、因数に含まれる 5 の総数を求められます。この「5 の個数」がそのまま末尾のゼロの個数と一致するのです。入出

  13. C++でN本の交差しない弦を使って円を分割する方法の数を数える

    問題概要整数 N が入力として与えられます。これは、円周上に 2×N 個の端点があるときに引く弦(chord)の本数を表します。目的は、どの弦も互いに交差しないように、これらの弦を使って円を分割する方法の数を数えることです。例えば N=3 の場合、円周上の点は 6 個になります。3 本の弦を引く 1 つの方法は、1−2、3−4、5−6 を結ぶものです。その他の引き方は以下のとおりです。1−6, 2−5, 3−41−2, 3−6, 4−51−4, 2−3, 5−61−6, 2−3, 4−5合計で 5 通りあります。入力例と出力例例 1入力:N=4出力:Count of ways to divid

  14. C++で整数nを奇数の和として表現する方法の数を求める

    整数 n が入力として与えられたとき、「n を奇数の和として表現できる方法が何通りあるか」を求めるのがこの問題の目的です。例えば n = 3 の場合、「1+1+1」と「3」の2通りの表現方法があるため、答えは2となります。入力例と出力例入力n=6出力Count of ways to express n as sum of odd integers are: 8解説n = 6 を奇数の和で表現すると、以下の8通りがあります。1. 1+1+1+1+1+1 2. 3+1+1+1 3. 1+3+1+1 4. 1+1+3+1 5. 1+1+1+3 6. 3+3 7. 1+5 8. 5+1入力n=9出力C

  15. C++で整数を連続する自然数の和として表現する方法の数を求める

    整数 num が入力として与えられたとき、その数を「2つ以上の連続する自然数の和」として表現できるパターンが何通りあるかを求めるのが本記事の目的です。たとえば n=3 の場合は 1+2 と表現できるため、答えは 1 通りになります。 入力例 num=6 出力 連続する数の和として数を表現する方法の数:1 説明 6 を連続する自然数の和で表現する方法:1+2+3 入力例 num=19 出力 連続する数の和として数を表現する方法の数:1 説明 19 を連続する自然数の和で表現する方法:9+10 アルゴリズムの考え方 ここで採用するアプローチは、対象の数を「a + (a+1) + (a+2) + …

  16. C++で数値を「累乗の和」として表現する方法の数を求める

    2つの整数 num と power が入力として与えられます。この問題の目的は、num を「相異なる自然数の累乗の和」として表現する方法が何通りあるかを求めることです。例えば、num が 10、power が 2 の場合、10 は 12 + 32 と表現できるため、方法は合計 1 通りとなります。 入力例と出力例 入力 num=30 出力 Count of ways to express a number as sum of powers are: 2 説明 30 を累乗の和として表現する方法は、以下の 2 通りがあります。 12 + 22 + 5212 + 22 + 32 + 42 入

  17. C++で連続する2を使わずに1と2でスコアに到達する方法の数を求める

    バッティングのスコア(ラン数)が与えられます。バッツマンは1球につき1ランまたは2ランのいずれかしか獲得できないという条件のもとで、そのスコアに到達することを目標とします。ただし重要な制約として、2ランを連続して取ることはできません。例えばスコア6に到達する場合、「1+2+1+2」のようにランを取ることはできますが、「2+2+1+1」のように連続する2を含む方法は認められません。 入出力例 例1 入力: score=4 出力: 連続する2を使わずに1と2でスコア4に到達する方法の数: 4 説明: スコア4に到達する方法は以下の4通りです: 1+1+1+1、1+1+2、1+2+1、2+1+1 例

  18. C++でビショップが1回の移動で到達できるマスの総数を数える方法

    8×8のマス目で表されるチェス盤上に、ビショップ(Bishop)の位置が行番号と列番号の形式で与えられます。この記事の目的は、ビショップが1回の移動で到達できるマスの総数を求めることです。ビショップは斜め方向(左上・左下・右上・右下の4方向)にのみ移動できる駒である点に注意してください。入出力例例1入力:row = 5, column = 4出力:ビショップが1回の移動で到達できるマスの総数:13説明:上の図に示したように、この位置ではビショップは4つの斜め方向すべてに移動でき、合計13マスをカバーできます。例2入力:row = 1, column = 1出力:ビショップが1回の移動で到達でき

  19. C++で解くゲーム問題:0以下に減らせる数の個数を求めるアルゴリズム

    問題概要 正の数からなる配列と、2つの整数 A と B が与えられます。2人のプレイヤーが交互に手番を進め、配列内の数値を操作していくゲームを考えます。プレイヤー1は配列の任意の要素を A だけ減らすことができ、プレイヤー2は任意の要素を B だけ増やすことができます。 求めたいのは、プレイヤー1が0以下に減らせる数の個数です。プレイヤー1が先手であり、一度0以下に減らされた数は、それ以降プレイヤー2の対象とはなりません。 入出力例 例1 入力: arr[] = { 1, 4, 5, 2 }、A = 2、B = 3 出力: ゲームで0以下に減らせる数の個数:1 説明: プレイヤー1が減らせるの

  20. C++で行列を移動する経路の数を数える方法

    問題概要 行数 row × 列数 col の2次元行列が与えられます。目的は、セル (0,0) からセル (row, col) まで、「右」と「下」の移動のみを使って到達する方法が何通りあるかを数えることです。つまり、最初の移動は (0,0) → (0,1)(下方向)または (0,0) → (1,0)(右方向)のいずれかであり、(1,1) への斜め移動は認められません。 具体例 入力 col = 2; row = 4 出力 行列を移動する方法の数: 4 説明 セル (0,0) からセル (2,4) まで到達する経路は、以下の図のように表せます。 入力 col = 4; row = 3 出力

Total 5990 -コンピューター  FirstPage PreviousPage NextPage LastPage CurrentPage:239/300  20-コンピューター/Page Goto:1 233 234 235 236 237 238 239 240 241 242 243 244 245