Python

 Computer >> コンピューター >  >> プログラミング >> Python
  1. Pythonで隣接要素の条件付きスワップにより配列をソートできるか判定する方法

    問題の概要0からn-1までの範囲に含まれる要素で構成された、順序がバラバラの数値配列numsがあるとします。この配列に対しては、「隣接する2つの要素の絶対差が1である場合に限り」隣接要素同士を入れ替える(スワップする)ことができます。必要な回数だけスワップを繰り返せるとして、このnumsを昇順にソートできるかどうかを判定するのが目的です。例えば、入力が nums = [1, 0, 3, 2, 5, 4] の場合、出力はTrueになります。これは、ペア (1, 0)、(3, 2)、(5, 4) をそれぞれスワップすることで、[0, 1, 2, 3, 4, 5] というソート済みの配列を作れるため

  2. Pythonで回転操作により配列をソートできるか判定する方法

    問題の概要 数値のリスト nums が与えられ、「回転」操作を使ってこのリストを昇順にソートできるかどうかを判定します。ここでいう回転とは、配列の末尾から連続するいくつかの要素を取り出し、そのまま配列の先頭へ移動させる操作のことです。 例えば、入力が nums = [4,5,6,1,2,3] の場合を考えてみましょう。末尾の3つの要素「1, 2, 3」を先頭に移動させると [1,2,3,4,5,6] となり、ソートが完了します。したがって、この場合の出力は True となります。 解法のアプローチ この問題は、次の手順で解くことができます。 n をリスト nums のサイズとします。 もし

  3. Pythonで島での生存が可能かどうかを判定するアルゴリズム

    問題の概要ある島に店が1軒だけあり、この店は日曜日を除いて毎日営業しているとします。この状況で、以下の3つの値が入力として与えられます。N:1日に購入できる食料の最大数S:生き延びる必要がある日数M:1日に必要な食料の数今日が月曜日であり、これからのS日間を生き延びなければならないとします。このとき、そもそも生存が可能かどうかを判定し、可能な場合は食料を買いに行くべき最小の日数を求めるのがこの問題の目的です。具体例たとえば、S = 12、N = 24、M = 3 という入力が与えられた場合を考えてみましょう。この場合の出力は (True, 2) となります。つまり生存は可能で、食料の購入はわず

  4. Pythonで文字列sを別の文字列tに変換できるか判定する方法

    2つの文字列 s と t が与えられ、t はすべて大文字であるとします。次の操作を繰り返すことで、s を t に変換できるかどうかを判定する問題を考えてみましょう。一部の小文字を大文字に変換する。すべての小文字を削除する。たとえば、入力が s = fanToM、t = TOM の場合、出力は True になります。o を O に変換し、残りの小文字をすべて削除すれば t と一致するためです。解法のアプローチこの問題は動的計画法(DP)を使って効率的に解けます。dp[i][j] を「s の先頭 i 文字を使って、t の先頭 j 文字を作れるかどうか」を表す真偽値として定義します。具体的な手順は以

  5. Pythonで配列を合計が等しいk個の連続する部分配列に分割できるか判定する方法

    数値の配列 nums と整数 k が与えられたとき、nums を k個の連続する部分配列に分割して、それぞれの部分配列の要素の合計がすべて等しくなるようにできるかどうかを判定する問題を考えてみましょう。問題の例たとえば、入力が nums = [2, 5, 3, 4, 7]、k = 3 の場合を考えます。このとき、[(2, 5), (3, 4), (7)] のように3つに分割でき、各部分配列の合計はいずれも 7 で等しくなるため、出力は True になります。解法のアプローチこの問題は累積和(prefix sum)を使うことで効率的に解けます。全体の合計が k で割り切れない場合は即座に Fal

  6. Pythonで天秤とべき乗の重りを使って物品の重さを測定できるか判定する方法

    この記事では、整数 a のべき乗で表される重り(a0, a1, a2, …, a100)と、両側に重りを載せられる天秤を使って、重さ W の物品を測定できるかどうかを Python で判定する方法を解説します。 問題の概要 重りは天秤の左右どちら側にも置くことができます。つまり、各重りについて「使わない」「物品と同じ側に置く(引く)」「反対側に置く(足す)」の3つの選択肢があります。 例えば、a = 4、W = 17 の場合を考えてみましょう。利用できる重りは a0 = 1、a1 = 4、a2 = 16 です。16 + 1 = 17 となるため、出力は True になります。 解法のアプローチ

  7. Pythonで配列要素の最小公倍数(LCM)がkで割り切れるかどうかを判定する方法

    配列 nums と整数 k が与えられたとき、配列内のすべての要素の最小公倍数(LCM)が k で割り切れるかどうかを判定します。例えば、nums = [12, 15, 10, 75]、k = 10 の場合、配列要素の LCM は 300 となり、300 は 10 で割り切れるため、出力は True になります。解き方のアプローチこの問題は次の手順で解くことができます。math.gcd を使って、配列の先頭から順に隣接する要素同士の LCM を計算していく最終的に得られた LCM を k で割った余りが 0 かどうかを判定する余りが 0 なら True、そうでなければ False を返すなお、

  8. Pythonで2つの二分木の葉の走査(リーフトラバーサル)が同じかどうかを判定する方法

    問題概要2つの二分木が与えられたとき、それらの「葉の走査(リーフトラバーサル)」が同じかどうかを判定する問題を考えてみましょう。葉の走査とは、木を左から右へと辿ったときに現れる葉ノードの値の並び順のことです。例えば、次のような2つの二分木が入力として与えられた場合を考えます。この場合、両方の木の葉の走査順序は [5, 7, 8] で同一であるため、出力は True になります。アルゴリズムの考え方この問題は、再帰を使わずにスタック(LIFO構造)を利用して反復的に解くことができます。各木について、内部ノードの子をスタックに積みながら葉ノードを1つずつ取り出し、2つの木から取り出した葉の値を順番

  9. Pythonで連結リストが降順にソートされているか判定する方法(反復処理・再帰の両方を解説)

    問題の概要 連結リスト(リンクリスト)が与えられたとき、それが降順(非増加順)にソートされているかどうかを判定する2つの関数を定義することを考えます。1つ目の関数は反復処理で動作し、2つ目の関数は再帰呼び出しで動作します。 たとえば、入力が L = [15, 13, 8, 6, 4, 2] の場合、すべての要素が降順に並んでいるため、出力は True となります。 解決のためのアプローチ この問題は、次の手順で解くことができます。 反復版の関数 solve_iter() を定義します(引数として先頭ノード head を受け取ります)。  ・head が null(None)の場合は Tru

  10. Pythonで文字列の小文字と大文字が同じ順序かどうかを判定する方法

    問題の概要 ここでは、アルファベットの大文字と小文字のみで構成された文字列 s を考えます(数字は含まれないものとします)。この文字列に対して、小文字が出現する順序と大文字が出現する順序がそれぞれ一致しているかどうかを判定します。つまり、ある文字が小文字として複数回現れる場合、その文字が大文字としても同じ回数、同じ相対的な位置関係で現れていなければなりません。 たとえば、入力が s = piPpIePE の場合、出力は True になります。小文字だけを抜き出すと pipe、大文字だけを抜き出すと PIPE となり、小文字部分を大文字に変換した結果が大文字部分と完全に一致するためです。 解決の

  11. Pythonで部分行列の四隅の要素のパリティを反転して、行列AをBに変換できるかどうかを判定する方法

    ここでは、2つの N × M のバイナリ行列 A と B が与えられているとします。1回の操作では、2×2 以上のサイズの部分行列を選択し、その四隅の要素のパリティ(0 と 1)を反転することができます。求めたいのは、この操作を任意の回数だけ繰り返して、行列 A を行列 B に変換できるかどうかの判定です。 たとえば、入力が次のような場合を考えてみましょう。 100 101 100 この場合の出力は True になります。mat1 の左上にある 2×2 の正方形部分行列に対して操作を1度実行すれば、mat2 が得られるからです。 解法のアプローチ この問題を解くために、次の手順に従い

  12. Pythonで正方形の部分行列を転置して別の行列へ変換できるかを判定する方法

    N × M の2つの行列 mat1 と mat2 が与えられているとします。許されている操作は「mat1 内の任意の正方形の部分行列を選び、それを転置する」というものです。この操作を何度でも適用できるとき、mat1 から mat2 を作り出せるかどうかを判定するのがこの問題です。 たとえば、入力が次のようなケースを考えてみましょう。 567123689 562173689 この場合の出力は True になります。mat1 の右上側にある 2×2 の部分行列を転置すると、mat2 と完全に一致するからです。 鍵となる性質:「行番号+列番号」は転置しても変わらない まず押さえておきたい重要な観

  13. Pythonで各行を反転しても行列が変わらないかどうかを判定する方法

    問題の概要 正方行列が与えられたとき、各行を反転(リバース)した後も、行列全体が元のまま変わらないかどうかを判定するプログラムをPythonで作成してみましょう。 言い換えると、この問題は「すべての行が回文(左右対称)になっているか」を確認する問題です。ある行を反転しても元の並びと同じになるなら、その行は回文であると言えます。 たとえば、次のような行列が入力された場合を考えてみます。 686 282 333 この場合、出力は True になります。どの行も反転しても元の並びとまったく同じになるためです。 解法のアプローチ この問題は、両ポインタ(two pointers)テクニックを

  14. Pythonで一方の文字列の最頻文字が他方の文字列に同じ回数現れるかどうかを確認する方法

    2つの文字列 s と t が与えられたとき、s の中で最も多く出現する文字(最頻文字)を取り出し、その文字が t にも同じ回数だけ含まれているかどうかを判定する問題について解説します。 例えば、s = crosssection、t = securesystem という入力の場合、s の最頻文字は「s」です。そして t の中にも「s」は同じ回数(4回)出現するため、出力は True になります。 解法のアプローチ この問題を解くには、以下の手順に従います。 s の各文字とその出現回数を記録したマップ(freq)を作成する freq の中で出現回数が最大の文字(max_freq_char)を求め

  15. Pythonで7セグメントディスプレイ表示時の数値の鏡像が同じかどうかを判定する方法

    ある数値 n が与えられたとき、それを7セグメントディスプレイに表示した状態で左右反転(鏡像)しても、元の表示と同じ見た目になるかどうかを判定する問題を解説します。例えば、n = 818 の場合、出力は True になります。「818」を7セグメントディスプレイ上で左右に反転しても、まったく同じ表示になるためです。判定の考え方7セグメントディスプレイにおいて、左右反転しても形が変わらない数字は「0」「1」「8」の3つだけです。この性質を利用すると、次の手順で判定できます。まず、数値 n を文字列に変換します。すべての桁が「0」「1」「8」のいずれかであるかを確認します。それ以外の数字が1つでも

  16. Pythonでスタックやキューの操作列が有効かどうかを判定する方法

    2値からなるリストを考えます。「1」はスタックまたはキューへのプッシュ(push)操作、「0」はポップ(pop)操作を表します。このとき、与えられた操作の列が実際に実行可能(有効)であるかどうかを判定する必要があります。 例えば、入力が nums = [1,0,1,1,0,1] の場合、操作列は [Push, Pop, Push, Push, Pop, Push] となります。この順序では空のスタックから要素を取り出す(ポップする)場面がないため、出力は True となり、この操作列は有効であると判断できます。 解法のアプローチ この問題は、カウンターを使ったシンプルなシミュレーションで解けま

  17. PythonでNが{A, B}の繰り返し足し算で表現できるかどうかを判定する方法

    ある数値 target と、2つの整数 A と B が与えられたとき、A と B をそれぞれ何度でも足し合わせることで target を作り出せるかどうかを判定する問題を考えてみましょう。例えば、Target = 26、A = 5、B = 7 という入力の場合、出力は True になります。これは (7 + 7 + 7 + 5) のように A と B を組み合わせることで 26 を作れるためです。解法のアプローチこの問題は、深さ優先探索(DFS)とメモ化を組み合わせることで効率的に解けます。基本的な考え方は、「0 から出発して A または B を足し続け、target に到達できる経路が存在す

  18. Pythonで数値が階乗素数(Factorial Prime)かどうかを判定する方法

    ある数値 n が与えられたとき、それが階乗素数(Factorial Prime)であるかどうかを判定する方法を解説します。階乗素数とは?階乗素数とは、「ある整数の階乗に対して 1 小さい数、または 1 大きい数」であり、かつ素数である数のことです。例えば、入力が n = 719 の場合、出力は True になります。これは以下のように表せるためです。719 = 720 − 1 = 6! − 1判定アルゴリズムの手順この問題は、次の手順で解くことができます。まず、num が素数であるかを確認します。素数でなければ False を返します。変数を初期化します:factorial = 1、i = 1

  19. 【Python】数字AとBのみで構成される数値がNを割り切れるかどうかを判定する方法

    数値 n が与えられ、さらに2つの数値 a と b があるとします。このとき、「a と b のみを使って生成できる数値」の中に、n を割り切るものが存在するかどうかを判定する必要があります。例えば、入力が n = 115、a = 3、b = 2 の場合、出力は True になります。これは、2と3だけで構成される数値「23」が 115 を割り切れる(115 ÷ 23 = 5)ためです。解決のアプローチこの問題は再帰的な探索によって解決できます。a と b を末尾に付け加えながら数値を伸ばしていき、その都度 n を割り切れるかを確認します。具体的な手順は以下の通りです。関数 util() を定義

  20. Pythonで算術演算子を使わずにxが2のn乗で割り切れるか判定する方法

    問題の概要二つの整数 x と n が与えられたとき、算術演算子(+、-、*、/、%など)を使わずに、x が 2 の n 乗(2^n)で割り切れるかどうかを判定します。例えば、入力が x = 32、n = 5 の場合、32 = 2^5 であるため、出力は True になります。解法の考え方この問題はビット演算を使うことでエレガントに解くことができます。ポイントは以下の通りです。2^n で割り切れる数は、2進数表現において下位 n ビットがすべて 0 になっています。(1 << n) - 1 を計算すると、下位 n ビットだけが 1 になったマスクが得られます(例:n = 5 なら 0

Total 8994 -コンピューター  FirstPage PreviousPage NextPage LastPage CurrentPage:219/450  20-コンピューター/Page Goto:1 213 214 215 216 217 218 219 220 221 222 223 224 225