Python

 Computer >> コンピューター >  >> プログラミング >> Python
  1. Pythonで街区を訪問する総移動距離(マンハッタン距離)を求める方法

    問題の概要都市の街区を表す、重複のない文字列からなる行列(mat)と、訪問したい街区名のリスト(blocks)が与えられます。現在位置は mat[0][0] から出発し、リストに記載された順番どおりにすべての街区を訪問するときに必要なマンハッタン距離の合計を求めるのがこの問題の目的です。マンハッタン距離とは、2点間の移動距離を「上下方向の差」と「左右方向の差」の絶対値の和として測るもので、碁盤の目状に区画された街路を移動するイメージに近い距離概念です。たとえば、入力が次のような場合を考えてみましょう。qbcdezghiblocks = [h, b, c]このとき出力は 6 となります。移動の内

  2. Pythonでコラッツ数列の長さを求めるアルゴリズムと実装例

    正の整数 n が与えられたとき、そのコラッツ数列(Collatz sequence)の長さを求める問題を考えてみましょう。 コラッツ数列とは、次の規則に従って順次生成される数列です。 n が偶数の場合:n = n / 2 n が奇数の場合:n = 3n + 1 そして、n が 1 になった時点で数列は終了します。この規則は「コラッツ予想」として知られる有名な未解決問題に関連しており、任意の正の整数から始めても必ず 1 に到達すると予想されています。 具体例 たとえば入力が n = 13 の場合、出力は 10 になります。これは次の数列が生成されるためです。 [13, 40, 20, 10,

  3. Pythonで行列の各列を昇順にソートする方法を解説

    問題の概要 行列が与えられたとき、それぞれの列を昇順(小さい順)に並べ替えるという問題を考えます。行ごとではなく、列単位でソートするのがポイントです。 例えば、次のような行列が入力されたとします。 1121316641118 この場合、出力は次のようになります。 1646118112131 1列目は 11, 6, 1 が 1, 6, 11 に、2列目は 21, 6, 11 が 6, 11, 21 に、3列目は 31, 4, 8 が 4, 8, 31 に、それぞれ昇順に並べ替えられていることが分かります。 解き方のアルゴリズム この問題は、次の手順で解くことができます。 R := 行列の行数

  4. Pythonで2つの文字列に共通する単語の数を求める方法

    2つの文字列 s0 と s1 があり、それぞれが1つの文を表しているとします。このとき、両方の文に共通して含まれる単語(重複は数えない)の個数を求める問題を考えてみましょう。なお、単語の比較では大文字・小文字を区別しないため、「tom」と「ToM」は同じ単語として扱われます。 たとえば、入力が s0 = i love python coding、s1 = coding in python is easy の場合、共通する単語は [python, coding] の2つなので、出力は 2 になります。 解決のための手順 この問題は、次の手順で解くことができます。 s0 と s1 をすべて小文字

  5. PythonでConnell(コネル)数列のn番目の項を求める方法

    数 n が与えられたとき、Connell(コネル)数列の n 番目の項を求める問題を考えてみましょう。まずは、この数列がどのような規則で構成されているのかを確認します。 Connell数列とは? Connell数列は、「奇数・偶数を交互に、取り出す個数を1つずつ増やしながら」並べていく数列です。生成ルールは次のとおりです。 最初に、奇数を1つ取ります:1 次に、偶数を2つ取ります:2, 4 続いて、奇数を3つ取ります:5, 7, 9 その次は、偶数を4つ取ります:10, 12, 14, 16 以降も同じパターンを繰り返します つまり、Connell数列は「1, 2, 4, 5, 7,

  6. Pythonで文字列内の連続した重複文字を削除する方法

    ここでは、「R」と「L」のみで構成された文字列 s を扱います。目標は、連続する「R」および連続する「L」が一切存在しない状態にするために、削除する文字数を最小限に抑えることです。たとえば、入力が LLLRLRR の場合、出力は LRLR となります。解決の手順この問題を解決するには、以下の手順に従います。変数 seen に文字列の最初の文字を代入します。変数 ans にも文字列の最初の文字を代入します。インデックス1以降の各文字 i について以下を繰り返します。i が seen と異なる場合:ans に i を追加します。seen を i で更新します。最後に ans を返します。つまり、直

  7. 【Python】n×nボードから四隅の対角線セルを削除した後に残るセル数を求める方法

    問題概要一辺の長さ n を表す整数が与えられ、n × n のボードを考えます。4つの隅から伸びる2本の対角線上にあるセルをすべて削除し、その後に残っているセルの数を求めるのがこの問題です。たとえば入力が n = 4 の場合、ボードは次のようになります(X が削除対象のセル、O が残るセルです)。XOOXOXXOOXXOXOOXこの場合、出力は 8 となります。解法の考え方この問題は、ボードを実際に生成しなくても次の式一つで答えを求められます。n × n − 2 × n + (n mod 2)なぜこの式で求まるのか?全体のセル数は n2 です。2本の対角線にはそれぞれ n 個ずつセルがありますが

  8. Pythonでリスト内の要素xについてx+1も存在する要素の数を数える方法

    Pythonでは、数値のリストが与えられたとき、「その要素 x に対して x + 1 も同じリスト内に存在する」という条件を満たす要素の個数を求める問題を効率的に解くことができます。 例えば、入力が [2, 3, 3, 4, 8] の場合を考えてみましょう。 2 については 3 が存在するためカウント対象 3(1つ目)については 4 が存在するためカウント対象 3(2つ目)についても同様にカウント対象 4 については 5 が存在しないため対象外 8 については 9 が存在しないため対象外 したがって、出力は 3 となります。 解法のアプローチ この問題は、以下の手順で解くことができます。

  9. Pythonで文字列内の恐竜の数を数える方法

    「animals」という文字列と「dinosaurs」という文字列があるとします。animals の各文字は異なる種類の動物を表し、dinosaurs の一意な文字はそれぞれ異なる恐竜を表しています。このとき、animals 文字列の中に含まれる恐竜の総数を求める必要があります。 例えば、入力が animals = xyxzxyZ、dinosaurs = yZ の場合、出力は 3 になります。これは、恐竜の種類として y と Z の2種類があり、動物の文字列には y が2つ、Z が1つ含まれているためです。 解決のアプローチ この問題は、以下の手順で解くことができます。 結果を格納する変数

  10. 【Python】偶数インデックスと奇数インデックスの要素を入れ替える方法

    問題の概要 数値のリスト nums が与えられたとき、偶数インデックス(0, 2, 4, ...)に位置する要素同士、および奇数インデックス(1, 3, 5, ...)に位置する要素同士を、それぞれ2個ずつペアとして入れ替えることを考えます。 たとえば、入力が [1,2,3,4,5,6,7,8,9] の場合、出力は [3, 4, 1, 2, 7, 8, 5, 6, 9] になります。インデックス0と2、1と3、4と6、5と7の要素がそれぞれ入れ替わっているのがわかります。 解法のアプローチ この問題は、以下の手順で解くことができます。 まず、リスト nums の長さを取得します。 インデッ

  11. Pythonでリストが最大ヒープ(Max Heap)かどうかを判定する方法

    数値のリスト nums が与えられたとき、そのリストが最大ヒープ(Max Heap)として成立しているかどうかを判定する問題について解説します。最大ヒープの条件リストが最大ヒープであるためには、以下のルールをすべて満たす必要があります。インデックス 2*i + 1 が範囲内に存在する場合、nums[i] >= nums[2*i + 1] が成り立つことインデックス 2*i + 2 が範囲内に存在する場合、nums[i] >= nums[2*i + 2] が成り立つことつまり、各親ノードの値が、その子ノードの値以上でなければなりません。これはヒープ構造の基本的な性質です。入力例と出力

  12. Pythonで不正投票(重複投票)を検出する方法

    選挙システムなどでは、同じ有権者が複数回投票していないかをチェックする仕組みが重要になります。この記事では、Pythonを使って重複投票を効率的に検出するアルゴリズムを紹介します。 問題の定義 投票データを表すリストが与えられます。リストの各要素は2つの値を持っており、[c_id, v_id] の形式になっています。 c_id:候補者ID v_id:投票者ID この中に、2回以上投票している有権者が存在するかどうかを判定するのが目的です。 入力例 [[5, 1], [5, 0], [5, 4], [5, 3], [5, 0]] この場合、[5, 0] が2回登場しているため、出力は Tru

  13. Pythonでテキスト内の2つの単語間の最小距離を求める方法

    プログラミングの問題としてよく知られているのが、「テキスト中に現れる2つの指定単語の間の最小距離を求める」という課題です。具体的には、文字列 word0、word1 および長いテキスト text が与えられたとき、テキスト内に出現する word0 と word1 の任意のペアについて、その間にある単語数として測られる距離の最小値を求めます。どちらか一方でもテキストに存在しない場合は -1 を返します。問題の例たとえば、次のような入力を考えてみましょう。text = cat dog abcd dog cat cat abcd dog wxyzword0 = abcdword1 = wxyzこの場

  14. Pythonで解くドミノ敷き詰め問題:n×mボードに置けるドミノの最大数

    問題概要縦 n × 横 m のサイズを持つボードと、無限に用意できる 1 × 2 のドミノ牌があるとします。このとき、ドミノ同士が重ならないこと、そしてすべてのドミノがボード内に完全に収まることという条件のもとで、ボードに置けるドミノの最大数を求めるのがこの問題です。例えば、入力が n = 5、m = 3 の場合、出力は 7 になります。解き方のアプローチこの問題は、一見複雑に思えますが、実はとてもシンプルな計算で解くことができます。手順は以下の通りです。t := n * m(ボードのマス目の総数を求める)(t / 2) の商(小数点以下は切り捨て)を返す1枚のドミノがちょうど2マスを占めるた

  15. Pythonで倍加・反転・入替を繰り返すパターン列のn番目を求める方法

    整数 n が与えられたとき、特定の規則に従って生成される文字列パターン列の n 番目の値を求める問題を考えます。このパターン列は次のように始まります。 xxy xxyxxy yxxyxx xyyxyy xyyxyyxyyxyy … パターンを生成する3つのルール 最初の項を xxy とし、次の値を作るには以下のルールを順番に適用します。 倍加(ダブル): 文字列をそれ自身と連結して、長さを2倍にします。 反転(リバース): 直前の操作が倍加だった場合、文字列を前後逆に並べ替えます。 入替(スワップ): 直前の操作が反転だった場合、すべての x を y へ、y を x へ置き換えます。 こ

  16. Pythonで文字列から「y」と「xz」を1回の処理でまとめて削除する方法

    Pythonで文字列から特定の部分文字列を1回の処理で削除する 文字列 s が与えられたとき、その中に含まれるすべての「y」と「xz」を1回の反復処理で削除することを考えます。 たとえば、入力が s = xyxxzyyxxzx の場合、出力は xxxx となります。 解決のアプローチ この問題は、以下の2つのステップで解決できます。 まず、「xz」を削除した文字列を作成する 次に、その結果から「y」をさらに削除して返す それでは、実際の実装を見ていきましょう。 実装例 class Solution:     def solve(self, s): &

  17. Pythonでリスト内の連続する偶数要素を交換する方法

    問題の概要数値のリスト nums が与えられたとき、「連続して現れる偶数」同士をペアごとに入れ替えることを考えます。たとえば、入力が nums = [4, 5, 6, 8, 10] の場合、出力は [6, 5, 4, 10, 8] となります。解法のアプローチこの問題は、一時変数を1つ用意するだけでシンプルに解決できます。手順は以下の通りです。一時変数 temp を None で初期化するi を 0 からリストの要素数まで順にループさせるnums[i] が偶数(2で割った余りが0)の場合:temp が None でなければ、nums[i] と nums[temp] を交換し、temp を No

  18. Pythonで階乗を計算する方法|再帰関数を使った実装例

    10以下の整数 n が与えられたとき、その階乗(factorial)を求めることを考えます。階乗とは、次のように定義される値です。n! = n × (n − 1) × (n − 2) × … × 1たとえば、入力が 6 の場合、6! = 6 × 5 × 4 × 3 × 2 × 1 = 720 となるため、出力は 720 になります。解き方のアプローチこの問題は再帰(recursion)を使うとシンプルに解けます。手順は以下のとおりです。solve() という関数を定義し、引数として n を受け取るn ≤ 1 の場合は 1 を返す(再帰の終了条件=ベースケース)それ以外の場合は n * solv

  19. Pythonで文字列から等間隔の部分列として「programmingquestion」を検出する方法

    問題概要小文字のみで構成された文字列 s が与えられたとき、次の2つの条件を同時に満たす部分列(subsequence)が存在するかどうかを判定する問題を考えます。選んだ文字たちの隣り合うインデックスの差がすべて等しい(等間隔に並んでいる)その文字をつなぎ合わせると「programmingquestion」という文字列になる例えば、入力が「pzrzozgzrzazmzmziznzgzqzuzezsztzizozn」のような場合、適切な等間隔のステップで文字を拾うと「programmingquestion」が現れるため、出力は True となります。解法のアプローチこの問題は、開始位置となる「p

  20. 【Python】FizzBuzz問題の解き方|3と5の倍数を「Fizz」「Buzz」に置き換える

    数値 n が与えられたとき、1から n までのすべての数値を表す文字列のリストを作成するプログラムを考えます。ただし、以下のルールに従う必要があります。3で割り切れる場合は、数値の代わりに「Fizz」を出力する5で割り切れる場合は、数値の代わりに「Buzz」を出力する3と5の両方で割り切れる場合は、数値の代わりに「FizzBuzz」を出力するこれはプログラミング学習でよく知られている「FizzBuzz問題」であり、条件分岐とループ処理の基礎を確認するのに最適な題材です。解き方の手順この問題は、次の手順で解くことができます。1から n までの各数値について順番に判定を行う3と5の両方で割り切れる

Total 8994 -コンピューター  FirstPage PreviousPage NextPage LastPage CurrentPage:167/450  20-コンピューター/Page Goto:1 161 162 163 164 165 166 167 168 169 170 171 172 173