C++

 Computer >> コンピューター >  >> プログラミング >> C++
  1. C++で文字列内のセグメント数を数える方法

    問題概要文字列 s が与えられたとき、その文字列に含まれる「セグメント」の数を数えます。ここでセグメントとは、空白文字を含まない連続した文字の並びのことを指します。たとえば、入力が Hello, I love programming の場合、セグメントは4つ存在するため、出力は4になります。解法のアプローチこの問題は、以下の手順で解くことができます。カウンタ n を 0 で初期化します。i を 0 から文字列の長さ未満まで1ずつ増やしながらループ処理を行います。s[i] が空白でない場合、n を1増やします(新しいセグメントの開始を検出)。その後、i が文字列の範囲内であり、かつ s[i] が

  2. 【C++】n枚のコインを階段状に並べたときの完全な段数を求める方法

    n枚のコインを階段状に並べることを考えてみましょう。ここでは、k段目には必ずちょうどk個のコインが置かれるというルールがあります。つまり、与えられたn枚のコインから、何段の「完全な階段」を作ることができるかを求めるのがこの問題です。例えば、入力が5の場合、出力は2になります。5枚のコインで2段目までの完全な階段を作ることができますが、3段目には3枚のコインが必要なところ、残りは2枚しかないためです。図で表すと次のようになります。*****公式による解法この問題は、1段目からk段目までのコインの総数が 1 + 2 + … + k = k(k+1)/2 となることを利用すると、次の公式によって直接

  3. C++で配列の全要素を等しくするための最小移動回数を求める方法

    サイズ n の配列が与えられたとします。すべての配列要素を同じ値にするために必要な最小の移動回数を求めるのがこの問題の目的です。ここで「1回の移動」とは、n - 1 個の要素をそれぞれ 1 だけ増加させることを意味します。例えば、入力が [3,2,3,4] の場合、出力は 4 になります。解法のアプローチこの問題を解く鍵となるのは、発想の転換です。「n - 1 個の要素を 1 増やす」という操作は、要素間の相対的な差に着目すると「1 個の要素を 1 減らす」操作と数学的に等価です。したがって、各要素を最小値まで減らすのに必要な操作回数、つまり「各要素と最小値の差の総和」が答えになります。具体的

  4. C++でクッキーを子どもたちに割り当てる方法(貪欲法の解説)

    いくつかのクッキーを子どもたちに配ることを考えてみましょう。ただし、各子どもに渡せるクッキーは最大1個までという制約があります。ここで、各子ども i は「欲張り度(greed factor)」g[i] を持っています。これは、その子が満足するために必要なクッキーの最小サイズを表します。また、各クッキー j はサイズ s[j] を持ちます。s[j] >= g[i] が成り立つとき、クッキー j を子ども i に割り当てることができ、その子は満足します。この問題のゴールは、満足した子どもの数を最大化し、その最大数を出力することです。入力例と出力例たとえば、入力が [1,2](子どもの欲張り度

  5. C++で長方形を作成する – 目標面積から最適な縦横比を求める方法

    特定の面積を持つ矩形のウェブページ領域が与えられたとします。私たちの課題は、次の要件をすべて満たすように、長さ L と幅 W を持つ矩形のウェブページを設計することです。ウェブページの面積(L × W)は、指定された目標面積と一致しなければなりません。幅 W は長さ L を超えてはならず、L >= W を満たす必要があります。L と W の差は、できるだけ小さくなるようにします。例えば、入力が 4 の場合、出力は [2, 2] になります。目標面積が 4 であるとき、考えられる組み合わせは [1, 4]、[2, 2]、[4, 1] の3通りです。しかし、要件2により W ≤ L でなけれ

  6. C++で解く「キーボード行」問題:同じ行の文字だけで入力できる単語の見つけ方

    英単語のリストが与えられたとき、標準的なQWERTYキーボードレイアウトの同じ行に含まれる文字だけを使って入力できる単語をすべて見つけることを考えます。 例として、入力が [hello, world, mom, dad, try, type, tom] であれば、出力は [dad, try, type] となります。dad は中段の文字だけで、「try」と「type」は上段の文字だけで構成されているためです。 キーボードの行と文字の対応 標準的なQWERTY配列は、次の3つの行に分けられます。 1行目(上段):q, w, e, r, t, y, u, i, o, p 2行目(中段):a,

  7. C++で相対ランクを求める:上位3名に金・銀・銅メダルを割り当てるアルゴリズム

    問題概要N人の選手のスコアのリストが与えられ、それぞれの相対的な順位を求めます。中でも最も高いスコアを持つ上位3名には、それぞれ「Gold(金)」「Silver(銀)」「Bronze(銅)」のメダルを割り当てます。たとえば、入力が [2,5,3,1,0] の場合、出力は [Bronze, Gold, Silver, 4, 5] となります。解法のアプローチこの問題は、以下の手順で解くことができます。nums のサイズが 1 の場合は「Gold」を返します。nums のサイズが 2 の場合は、nums[0] > nums[1] であれば「Gold, Silver」を、そうでなければ「Sil

  8. C++で完全数を判定する方法をわかりやすく解説

    完全数とは?完全数(Perfect Number)とは、その数自身を除くすべての正の約数の総和が、元の数とちょうど等しくなるような自然数のことです。例えば 28 の場合、約数は 1、2、4、7、14 であり、その和は 1 + 2 + 4 + 7 + 14 = 28 となるため、28 は完全数であると言えます。問題の概要与えられた整数が完全数かどうかを判定するプログラムを作成します。判定対象となる数 n の範囲は 108(1億)以下とします。入力が 28 であれば、出力は True となります。解法のアプローチここで重要なポイントは、108 以下の範囲に存在する完全数はごくわずかだという点です。

  9. C++で2つの文字列の最長非共通部分列(Longest Uncommon Subsequence I)を求める方法

    問題の概要2つの文字列が与えられたとき、それらの最長非共通部分列(Longest Uncommon Subsequence)の長さを求める問題です。ここでいう最長非共通部分列とは、一方の文字列の部分列でありながら、もう一方の文字列には一切現れないような、最も長い部分列のことを指します。つまり、この問題では次のような処理を行います。最長非共通部分列の長さを求めて返す最長非共通部分列が存在しない場合は -1 を返す例えば、入力が aabbac と aabbcc の場合、出力は 6 になります。解法のアプローチ一見すると複雑な動的計画法が必要に思えますが、実は非常にシンプルな考え方で解くことができま

  10. C++で配列内のK-diffペアを求める方法

    問題の概要配列と整数kが与えられたとき、配列内に存在する「一意なk-diffペア」の数を求めることを考えます。ここでk-diffペアとは (i, j) のように表されるペアであり、i と j がどちらも配列内に存在し、両者の絶対差が k と一致するものを指します。例えば、入力が [3,1,4,1,5]、k = 2 の場合を考えてみましょう。このとき配列には (1,3) と (3,5) という2つの2-diffペアが存在するため、出力は 2 となります。解決のためのアプローチこの問題は、マップとセットを組み合わせることで効率的に解くことができます。手順は以下の通りです。seen と done と

  11. C++でBSTをグレーターツリーに変換する方法

    二分探索木(BST)が与えられたとき、それを「グレーターツリー(Greater Tree)」へ変換する問題を考えます。グレーターツリーとは、元のBSTの各キーを「元のキー + BST内にあるそのキーより大きいすべてのキーの合計」に書き換えた木のことです。 たとえば、次のような入力が与えられたとします。 このとき、期待される出力は次のとおりです。 解法のポイント:逆インオーダー走査 BSTを通常のインオーダー(左 → 根 → 右)で走査すると、キーは昇順に訪問されます。これに対して右 → 根 → 左の順で走査する「逆インオーダー走査」を行うと、キーは降順に訪問されます。この性質を利用し、訪

  12. C++でマトリックス(行列)の形を変える方法

    多くのプラットフォームやライブラリには、「reshape(リシェイプ)」という非常に便利な関数が用意されています。この関数は、マトリックス(行列)を異なるサイズの新しい形に変換するもので、格納されているデータ自体は一切変わりません。 ここでは、元のマトリックスと、変換後の行数 r・列数 c が与えられたときに、目的の形へ整形する方法を解説します。 例えば、入力が [[5,10],[15,20]] で row = 1、col = 4 の場合、出力は [[5, 10, 15, 20]] のようになります。 アルゴリズム この問題は、以下の手順で解くことができます。 要素を一時的に保持するための配

  13. C++でキャンディを均等に分配するアルゴリズムの解説

    問題概要 ここに偶数の長さを持つ配列があるとします。配列内の異なる数値はそれぞれ異なる種類のキャンディを表し、各数値は対応する種類のキャンディ1個を意味します。このキャンディを兄と妹に同数ずつ分配しなければなりません。そのうえで、妹が受け取れるキャンディの種類数の最大値を求めるのがこの問題の目的です。 例として、入力が [1,1,2,3] の場合を考えてみましょう。このときの出力は 2 となります。妹にキャンディ [2,3] を、兄にキャンディ [1,1] を渡すことで、妹は2種類の異なるキャンディを受け取れる一方、兄は1種類しか持てないためです。 解決のアプローチ この問題は「ユニークな種類

  14. C++で実装するN分木の先行順走査(プレオーダートラバーサル)

    N分木(n-ary tree)が与えられたとき、そのノードの値を先行順走査(プレオーダートラバーサル)で訪問した結果を求める問題を考えてみましょう。例として、次のような木が入力された場合を考えます。この場合の出力は [1, 3, 5, 6, 2, 4] となります。解き方のアプローチこの問題は、再帰を使うことでシンプルに解くことができます。手順は以下の通りです。結果を格納するための配列 ans を用意しますroot を引数に取る preorder() メソッドを定義しますroot が null(空)である場合は、空のリストを返しますroot の値を ans の末尾に追加しますroot の ch

  15. C++で整数配列の最長調和部分列(Longest Harmonious Subsequence)を求める方法

    問題概要 整数型の配列が与えられたとき、そのすべての部分列の中から「調和的な部分列」のうち最も長いものの長さを求めます。ここでいう調和的な配列とは、最大値と最小値の差がちょうど1である配列のことです。 たとえば、入力が [1,3,2,2,5,2,3,7] の場合、答えは 5 になります。これは、3つの「2」と2つの「3」からなる部分列 [3,2,2,2,3] が最長の調和的部分列となるためです。 解法のアプローチ この問題は、ハッシュマップを使って各値の出現回数を数えることで効率的に解けます。手順は以下の通りです。 出現回数を記録するためのマップ m を用意します。 配列 nums の各

  16. C++で解く「範囲加算 II」問題 ― 最大値の個数を効率的に求める方法

    問題の概要m × n の行列 M があり、すべての要素が 0 で初期化されているとします。ここに、複数の更新操作が与えられます。操作は 2 次元配列として表され、各操作は 2 つの正の整数 a と b からなる配列 [a, b] です。これは「0 ≤ i < a かつ 0 ≤ j < b を満たすすべての M[i][j] に 1 を加算する」という意味になります。すべての操作を実行した後、行列内に存在する最大値の出現回数を求めてください。入力例m = 3、n = 3、operations = [[2,2],[3,3]] の場合、出力は 4 になります。初期状態の行列は次のとおりです。00000

  17. C++で2つのリストの最小インデックス合計を求める方法

    友人であるアマルとビマルが、夕食のためのレストランを選ぼうとしています。二人とも、文字列として表されたお気に入りのレストランのリストを持っており、その中からリストインデックスの合計が最小となる共通のレストランを見つけたいと考えています。もし複数の候補が同点になった場合は、順序を問わずすべての候補を返します。例えば、入力が [ABC,PQR,MNO,XYZ] と [TUV,GHI,KLM,ABC] の場合、出力は [ABC] となります。解法のアプローチこの問題は、共通する要素を「インデックスの合計」をキーとしてマップに記録していくことで解決できます。以下の手順に従いましょう。マップ mp を定

  18. C++で花壇に花を植えられるか判定するアルゴリズムを解説

    問題概要細長い花壇があるとします。一部の区画にはすでに花が植えられており、残りの区画は空いています。ここで重要な制約がひとつあります。それは「花を隣接する区画に植えてはならない」というルールです。隣り合った花は水分を奪い合い、どちらも枯れてしまうためです。花壇は 0 と 1 からなる配列で表現され、0 は空き区画、1 は花が植えられている区画を意味します。さらに整数 n が与えられたとき、この隣接禁止ルールを破ることなく新しい花を n 本すべて植えられるかどうかを判定します。たとえば、入力が flowerbed = [1,0,0,0,1]、n = 1 の場合、出力は True(真)となります。

  19. C++で整数配列から3つの数の最大積を求めるアルゴリズム

    問題の概要整数型の配列が与えられます。この中から3つの数を選び、それらの積が最大になる組み合わせを見つけて、その最大積を返すことを考えましょう。例えば、入力が [1, 1, 2, 3, 3] の場合、選択すべき3つの要素は [2, 3, 3] となるため、出力は 18 になります。解決のアプローチこの問題は、以下の手順で効率的に解くことができます。配列 nums を昇順にソートする配列のサイズを l とする最大側の3要素 a = nums[l - 1]、b = nums[l - 2]、c = nums[l - 3] と、最小側の2要素 d = nums[0]、e = nums[1] を取り出す

  20. C++で平方数の和を判定するアルゴリズムを解説

    問題の概要 負でない整数 c が与えられたとき、a² + b² = c を満たす2つの整数 a と b が存在するかどうかを判定する問題です。 例えば、入力が 61 の場合、61 = 5² + 6² と表せるため、出力は True になります。 解法のアプローチ この問題は、0 から √c までの各整数 i について「c − i² が完全平方数であるか」を順に調べることで解けます。以下の手順に従います。 関数 isPerfect() を定義します。引数として x を受け取ります。 sr := x の平方根 を計算します。 (sr − sr の切り捨て値) が 0 であれば true を返しま

Total 5990 -コンピューター  FirstPage PreviousPage NextPage LastPage CurrentPage:187/300  20-コンピューター/Page Goto:1 181 182 183 184 185 186 187 188 189 190 191 192 193