C++

 Computer >> コンピューター >  >> プログラミング >> C++
  1. C++で2D座標点を出現頻度付きで昇順に出力する方法

    この問題では、2次元平面上の点の座標を表す2つの配列 x[] と y[] が与えられます。ここで、(x, y) の組み合わせが1つの点の座標に対応します。求められているのは、すべての点をその出現頻度とともに昇順で出力することです。 問題の例 入力と出力の例を見て、問題の内容を具体的に理解しましょう。 入力: x[]={0, 1, 1, 0, 0} ; y[]={1, 2, 2, 2, 1} 出力: (0, 1) = 2 (0, 2) = 1 (1, 2) = 2 この例では、点 (0, 1) と点 (1, 2) がそれぞれ2回出現しており、点 (0, 2) は1回だけ出現しています。 解決のア

  2. C++で2次元行列を効率的に検索する方法

    m × n の行列の中から特定の値を効率的に検索するアルゴリズムを考えます。この行列には、次のような性質があります。各行は左から右に向かって昇順にソートされている各行の先頭の数値は、直前の行の最後の整数よりも大きい例えば、行列が次のような場合を考えてみましょう。1357101116202330345053627898このとき、検索対象の値が 16 であれば、出力は True になります。アルゴリズムの考え方この問題は「2段階の二分探索」によって解くことができます。まず行方向の二分探索で、ターゲット値が存在しうる行を特定し、次にその行の中で列方向の二分探索を行います。計算量は O(log m +

  3. C++でソート済み配列から重複を削除する方法(各要素は最大2回まで許容)

    ソートされた配列 nums が与えられたとき、同じ要素が最大2回まで現れるように、配列自体を書き換える形(インプレース)で重複を削除し、新しい長さを返すことを考えます。この問題の重要な制約は、追加のメモリを使用できないという点です。つまり、O(1)の追加領域だけで解決しなければなりません。例えば、入力配列が [0,0,0,1,1,1,1,2,3,3] の場合、出力は [0,0,1,1,2,3,3] となり、新しい長さは 7 になります。アルゴリズムの考え方この問題は「二ポインタ(書き込み位置と読み取り位置)」を使うテクニックで効率的に解けます。ポイントは、既に確定した末尾2つの要素と比較するこ

  4. 回転ソート配列 II の検索を Python で実装する方法【二分探索の応用】

    昇順にソートされた配列が、事前に分からないあるピボットを軸として回転されている状況を考えてみましょう。例えば、配列が [0,0,1,2,2,5,6] である場合、回転によって [2,5,6,0,0,1,2] のようになっている可能性があります。 この配列の中から特定のターゲット値を検索します。ターゲットが配列内に存在すれば true を、存在しなければ false を返します。例えば、配列が [2,5,6,0,0,1,2] でターゲットが 0 の場合、出力は true となります。 この問題は「回転ソート配列の検索 II」として知られており、通常の二分探索との違いは、配列に重複した要素が含まれ

  5. C++で数値のK番目の最下位ビット(LSB)を出力する方法

    この記事では、与えられた整数 n の k 番目の最下位ビット(LSB:Least Significant Bit)を求めて出力する方法を、C++のコード例とともにわかりやすく解説します。 問題の概要 2つの整数 n と k が与えられたとき、n を2進数で表した際の「下から k 番目」のビットの値(0 または 1)を出力するのが課題です。 入出力例 入力: n = 12 , k = 3 出力: 1 解説: n = 12 の2進表現は「1100」です。ビットは右側(最下位)から数えるため、下から3番目のビットは 1 となります。 解き方のアプローチ この問題は、ビット演算を利用することで非常に効

  6. C++でソート済み連結リストIIから重複要素を削除する方法

    ソート済みの連結リストが与えられたとき、2回以上出現した要素をすべて取り除き、1度だけ現れる要素(ユニークな要素)だけを残すことを考えます。例えば、リストが [1,1,1,2,2,3,5,6,6,7,8] の場合、出力は [3,5,7,8] となります。これは、1・2・6 がそれぞれ複数回出現している一方で、3・5・7・8 は1度しか現れていないためです。アルゴリズムの手順この問題は、ダミーノード(番兵ノード)を活用することで効率的に解くことができます。手順は以下の通りです。値 -1 を持つダミーノードを作成し、prev := NULL、dummyPtr := dummy と初期化します。he

  7. C++で素数階乗(プリモリアル)を求めるプログラムの解説

    素数階乗(プリモリアル)とは?この問題では、数値 n が与えられ、その素数階乗(プリモリアル)を求めて出力することが課題となります。素数階乗(Primorial、Pn#)とは、「最初の n 個の素数をすべて掛け合わせた数」のことです。素数階乗は、通常の階乗(n!)とよく似た概念です。両者の違いは、階乗が任意の整数を順に掛けるのに対し、素数階乗では素数のみを掛け合わせる点にあります。問題の例具体例を見てみましょう。入力:N = 4出力:210説明:素数階乗 Pn# = 2 × 3 × 5 × 7 = 210解き方のアプローチこの問題を解くには、以下の手順で進めます。最初の n 個の素数をすべて求

  8. C++で解く「サブセットII」:重複を含む集合のべき集合を生成する方法

    問題の概要 数値の集合が与えられたとき、その集合から作れるすべての部分集合(サブセット)を生成することを考えます。この「すべての部分集合の集まり」はべき集合とも呼ばれます。ただし本問題では、要素に重複が含まれる可能性がある点に注意が必要です。 例えば、集合が [1,2,2] の場合、べき集合は次のようになります。 [[], [1], [2], [1,2], [2,2], [1,2,2]] アルゴリズムの考え方 この問題は再帰(バックトラッキング)を用いて解きます。各要素について「選ぶ/選ばない」の2択を再帰的に試すことで、すべての部分集合を網羅できます。また、重複する部分集合の登録を防ぐため、

  9. C++で素数nを法とする原始根を求める方法

    この問題では、素数Nが与えられ、その素数Nを法とする原始根(primitive root)を求めて出力することが課題となります。 原始根とは? 素数Nの原始根とは、1以上N-1以下の範囲に存在する整数xのことで、kが0からN-2までの範囲にあるとき、xk (mod N) の値がすべて異なる(一意である)ような整数を指します。 具体例で確認してみましょう。 入力:13 出力:2 この場合、2は13の原始根です。実際に計算すると、20, 21, 22, ..., 211 を法13で計算した結果はすべて異なる値となり、1〜12のすべての値をちょうど一度ずつ取ることが確認できます。 解法のアプローチ:

  10. C++で素数トリプレット(三つ組の素数)をすべて求める方法

    問題の概要この問題では、ある数値 N が与えられ、N未満のすべての素数トリプレットを見つけて出力することが求められます。素数トリプレットとは素数トリプレットとは、3つの素数からなる組のことで、次のいずれかの形で表されます。(p, p+2, p+6)(p, p+4, p+6)5以上の素数は必ず「6k±1」の形で表されるため、素数はこのパターンに従って三つ組にグループ化されます。入出力例入力:N = 13 出力:5 7 11解法のアプローチこの問題を解くには、まずN以下のすべての素数を求め、その後トリプレットの条件に合致するかどうかを確認します。素数の列挙にはエラトステネスの篩を用いることで、効率

  11. C++で連結リストの位置mからnまでを1パスで反転する方法

    問題概要連結リスト(リンクリスト)が与えられたとき、位置 m から n までのノードを反転させることを考えます。ただし、この操作は1回の走査(ワンパス)で完了させる必要があります。例えば、リストが [1,2,3,4,5] で m = 2、n = 4 の場合、結果は [1,4,3,2,5] となります。アルゴリズムの考え方この問題は、次の2つのメソッドを組み合わせて解きます。reverseBetween() がメインのエントリポイントとなり、内部で補助メソッド reverseN() を利用します。reverseN(): 先頭から数えて n 個のノードを再帰的に反転するメソッドreverseBet

  12. C++で文字列のASCII値の合計が素数かどうかを判定する方法

    この問題では、1つの文字列が与えられ、その文字列を構成する各文字のASCII値の合計が素数であるかどうかに応じて、YES / NO(素数文字列か否か)を出力することが求められます。前提知識ASCII値とは、コンピュータ上で文字を表現するための文字コードです。例えば、アルファベットの「A」は65、「a」は97といったように、すべての文字に固有の数値が割り当てられています。素数とは、1とその数自身以外に正の約数を持たない数のことです。具体的には、2、3、5、7、11、13などが該当します。問題の例入力:string = Hello 出力:No解決のアプローチこの問題を解くための手順は以下の通りです

  13. C++の素数ポイントとは?数値を2つの素数に分割するインデックスの求め方

    この問題では、ある数値 N が与えられます。私たちのタスクは、その数値が持つすべての素数ポイントを出力することです。素数ポイントがひとつも存在しない場合は、-1 を出力します。素数ポイントとは?素数ポイント(Prime Points)とは、数値を左右の2つの部分に分割したときに、その両方の部分が素数となる分割位置(インデックス)のことです。具体例を使って問題を理解しましょう。入力: 2359出力: 1説明: インデックス 1 の位置で数値を分割すると、「2」と「59」という2つの素数が得られます。したがって、1 が素数ポイントとなります。解法のアプローチこの問題を解くための手順は以下の通りです

  14. C++でn以下の「素数かつフィボナッチ数」をすべて出力する方法

    この問題では、ある数値 n が与えられ、n 以下の数の中で素数であり、かつフィボナッチ数でもあるものをすべて出力することが求められます。問題の例入力: n = 30 出力: 2 3 5 13解説30 未満のフィボナッチ数は「1, 1, 2, 3, 5, 8, 13, 21」です。この中で素数であるのは「2, 3, 5, 13」の4つとなります。解き方のアプローチこの問題を解くには、n 以下のフィボナッチ数をすべて求め、それぞれが素数かどうかを判定する方法が考えられます。しかし、より効率的なのは逆のアプローチです。エラトステネスの篩(ふるい)を使って、n 以下のすべての素数を求める。各素数がフィ

  15. C++で連結リストの循環を検出する:サイクルの起点ノードを見つける方法

    問題の概要連結リストが与えられ、その中に循環(サイクル)が存在するかどうかを判定することを考えます。循環の位置を表すために、pos という整数値を使用します。pos は、リストの末尾(tail)が接続されているノードの位置を示します。pos が -1 の場合、リストには循環が存在しないことを意味します。例えば、連結リストが [5, 3, 2, 0, -4, 7] で pos = 1 である場合、循環が存在し、末尾のノードは2番目のノード(値 3 のノード)に接続されていることになります。なお、この問題には「リストそのものを変更してはいけない」という制約があります。解法のアルゴリズム:フロイドの

  16. C++で合計がSとなる、素数Pより大きいN個の素数を見つける方法

    問題概要 この問題では、3つの値――合計 S、素数 P、そして個数 N ――が与えられます。求めるのは、「P より大きい素数の中から N 個を選び、その合計がちょうど S になるような組み合わせ」をすべて見つけることです。 入出力例 Input: N = 2, P = 5, S = 18 Output: 7 11 Explanation: 5より大きい素数 : 7 11 13 Sum = 7 + 11 = 18 この例では、5 より大きい素数は「7, 11, 13」ですが、その中で合計が 18 になるのは「7 + 11」の組み合わせだけであることがわかります。 解法のアプローチ まず、P と

  17. Pythonで二分木の先行順走査(プレオーダートラバーサル)を実装する方法

    Pythonでの二分木の先行順走査(プレオーダートラバーサル)とは二分木が与えられたとき、その木を先行順走査(プレオーダートラバーサル)で巡回した結果を返すことを考えます。先行順走査とは、「根のノード → 左部分木 → 右部分木」の順序でノードを訪問する木構造の基本的な走査手法です。例えば、次のような二分木があるとします。この木に対する先行順走査の結果は [3, 9, 20, 15, 7] となります。アルゴリズムの手順ここでは、再帰を使わずにスタックを利用した反復的なアプローチで問題を解きます。手順は以下の通りです。結果を格納するための空リスト res と、スタックとして使用する空リスト s

  18. C++で連結リストを挿入ソートする方法を解説

    ```html 連結リストが与えられたとき、そのリストに対して挿入ソート(Insertion Sort)を実行することを考えてみましょう。例えば、リストが [9,45,23,71,80,55] の場合、ソート後のリストは [9,23,45,55,71,80] となります。 配列と異なり、連結リストでは要素の挿入・削除がポインタの付け替えだけで行えるため、挿入ソートとの相性が良いという特徴があります。 アルゴリズムの手順 この問題を解くために、以下の手順に従います。 任意の値を持つダミーノード(番兵ノード)を新しく作成します。 node を与えられたリストの先頭に設定します。 node が N

  19. 【C++】セットビット数が素数となる数を範囲内で数える方法

    この記事では、2つの整数 L と R が与えられたとき、L から R の範囲内にある整数のうち、セットビット(2進表現で1になっているビット)の数が素数であるものの総数を求める方法を解説します。 問題の概要 まず、具体的な例で問題を確認しましょう。 入力: L = 7, R = 12 出力: 6 説明: 7 → 111、セットビット数 = 2(素数) 8 → 1000、セットビット数 = 1(素数ではない) 9 → 1001、セットビット数 = 2(素数) 10 → 1010、セットビット数 = 2(素数) 11 → 1011、セットビット数 = 3(素数) 12 → 1100、セットビ

  20. C++で配列要素のLCM(最小公倍数)の素因数を効率的に求める方法

    問題の概要 この問題では、1 ≤ arr[i] ≤ 1012 の範囲の整数からなる配列が与えられます。目的は、配列内のすべての要素の最小公倍数(LCM)に含まれるすべての素因数を出力することです。 入出力例 入力: array = {2, 5, 15} 出力: 2 3 5 説明: LCM = 30 30の素因数分解 = 2 × 3 × 5 解決のアプローチ 素直に考えると、まず配列の全要素のLCMを計算し、そのLCMを素因数分解して素数を列挙する、という流れになります。 しかし、1012オーダーの巨大な数を含む配列のLCMを直接計算すると、結果が桁違いに大きくなり、計算コストが非常に重くなっ

Total 5990 -コンピューター  FirstPage PreviousPage NextPage LastPage CurrentPage:131/300  20-コンピューター/Page Goto:1 125 126 127 128 129 130 131 132 133 134 135 136 137