Python

 Computer >> コンピューター >  >> プログラミング >> Python
  1. Pythonでバイナリ文字列の連続する1の最大長を求める方法:map関数と正規表現による2つのアプローチ

    数値をバイナリ(2進数)表現で扱う際、その中に「1」が何個連続して並んでいるのかを調べたいケースがあります。例えばデータ解析やビット演算の処理では、このような集計が必要になることがあります。本記事では、Pythonで連続する1の最大長を求める2つの方法を、具体的なコード例とともに解説します。 方法1:split関数とmap関数を組み合わせる Pythonのsplit()関数は、指定した区切り文字をもとに文字列を複数の部分に分割します。この性質を利用して、「0」を区切り文字としてバイナリ文字列を分割すると、残る各部分はすべて連続する「1」のブロックになります。そこでmap()関数で各ブロックの

  2. Pythonで素数かどうかを判定する方法

    素数は、暗号技術をはじめとする多くのアプリケーションで中心的な役割を果たしています。そのため、さまざまな場面でPythonプログラムを使って素数を判定できることは重要なスキルとなります。素数とは、1とその数自身以外に約数を持たない数のことです。この記事では、与えられた数が素数かどうかを判定するPythonプログラムを、基本的な手法から最適化された手法まで段階的に紹介します。 基本的なアプローチ ある数が素数かどうかを判定するには、以下の手順で処理を進めます。 まず入力された数が正の数かどうかを確認します。素数になり得るのは正の整数だけだからです。 2から「その数より1小さい数」までの範囲

  3. Pythonのitertoolsを使って文字列の重複しない順列を先頭からn個出力する方法

    順列(パーミュテーション)とは、複数のオブジェクトを異なる並び順で表現したものです。しかし、与えられたオブジェクトの中に同じ要素が含まれている場合、生成される順列の中にまったく同じ並びが現れることがあります。この記事では、Pythonの標準ライブラリitertoolsを使って、重複を除いた一意な順列だけを効率よく取り出す方法を解説します。基本の考え方itertoolsモジュールには、順列を生成するためのpermutations()メソッドが用意されています。ただし、元の文字列に重複した文字が含まれていると、このメソッドは同一の並びを何度も返してしまいます。そこで、以下の手順で一意な順列のみを取

  4. Pythonで数値を3桁ごとにカンマ区切りして出力する方法

    3桁以上の数値を扱う際には、読みやすさのためにカンマで桁区切りを行いたい場面が多くあります。特に会計業界や金融分野では、1,000単位ごとにカンマを挿入した表記は事実上の標準となっています。この記事では、Pythonを使って数値の適切な位置にカンマ(桁区切り文字)を挿入する方法を解説します。 format関数による桁区切り Pythonのformat関数(f文字列)では、次のような書式指定子を使うことで、カンマ区切りの表示を簡単に実現できます。 (f{num:,d}) # 「:」以降が書式指定子 # 「,」が桁区切り文字(カンマ) # 「d」は10進整数であることを示す指定 ポイントは「,」の

  5. Pythonで成績計算プログラムを作成する方法を徹底解説

    教育現場では、試験やテストの後に学生の成績(グレード)を判定する必要がよくあります。本記事では、あらかじめ定めた評定基準に基づいて自動的に成績を割り当てるPythonプログラムの作成方法を解説します。このプログラムを「成績計算機(グレード・カルキュレーター)」と呼ぶことにしましょう。評定基準(グレーディング基準)今回のプログラムでは、以下の評定基準を採用します。score >= 90 : O score >= 80 : A+ score >= 70 : A score >= 60 : B+ score >= 50 : B score >= 40 : C90点

  6. Pythonでインドの国旗を描く方法!NumPyとMatplotlibを使った完全ガイド

    Pythonのグラフ描画ライブラリは非常に多機能で、単なるデータの可視化にとどまらず、国旗のような図形も自由に描くことができます。その意味で、これらのモジュールには芸術的な一面もあると言えるでしょう。この記事では、numpyとmatplotlibというライブラリを使って、インドの国旗を描く方法をわかりやすく解説します。 インド国旗の構成要素 インドの国旗は、上から順にサフラン(オレンジ)、白、緑の3本の横帯で構成され、中央には24本のスポークを持つ紺色の車輪「アショーカ・チャクラ」(法輪)が描かれています。各要素には次のような意味が込められています。 サフラン(オレンジ):勇気と自己犠牲

  7. Pythonでピラミッドパターンを出力するプログラムの書き方

    Pythonのforループとrange関数を活用すれば、さまざまな形のピラミッド(三角形)パターンを描くことができます。このアプローチのポイントは、描画に使う記号の位置に対して縦横の余白を適切に確保できるよう、forループをどう設計するかにあります。本記事では、代表的な4種類のピラミッドパターンを、サンプルコードと実行結果とともに紹介します。パターン1:直角三角形まずは、左下を基準とした直角三角形のパターンです。外側のループで行数を制御し、内側のループで各行に表示する「*」の数を制御します。サンプルコードdef pyramid(p): for m in range(0, p):

  8. Pythonで配列のピーク要素を見つける方法|二分探索による効率的な実装

    配列の中からピーク要素(peak element)を探す問題について解説します。ピーク要素とは、両隣の要素よりも大きい要素のことです。入力配列 nums では nums[i] ≠ nums[i+1] が常に成り立つものとし、ピーク要素を1つ見つけてそのインデックスを返します。配列に複数のピーク要素が含まれる場合は、そのうちどれか1つのインデックスを返せば構いません。さらに、配列の範囲外は nums[-1] = nums[n] = −∞ とみなせるため、端の要素もピークになり得ます。 例えば、配列が [1, 2, 1, 3, 5, 6, 4] の場合、ピーク要素はインデックス 1(値 2)と

  9. Pythonで島の数を数える方法|DFSによるグリッド探索アルゴリズム

    問題の概要 0と1で構成された2次元グリッドが与えられ、そこに含まれる島の数を数えることを考えます。ここでいう「島」とは、水に囲まれた領域のうち、隣接する陸地(1)が水平方向または垂直方向につながって形成されるものを指します。グリッドの四方の端はすべて水に囲まれているものと仮定します。 たとえば、次のようなグリッドを考えてみましょう。色のついたセルは、それぞれ異なる島を表しています。 11000110000010000011 この場合、島は3つ存在することになります。 解き方のアプローチ この問題は、DFS(深さ優先探索)を応用した「洪水フィル(Flood Fill)」の手法で効率よく解くこと

  10. PythonでTrie(プレフィックス木)を実装する方法をわかりやすく解説

    Trie(トライ木・プレフィックス木)は、文字列の集合を効率的に管理するための木構造データ構造です。検索エンジンの補完機能やスペルチェッカーなど、 prefix(接頭辞)を扱う処理で広く活用されています。この記事では、Pythonを使ってTrieを実装する方法を解説します。実装するのは以下の3つの基本操作です。insert(word):単語をTrieに挿入するsearch(word):指定した単語が完全一致で登録されているか判定するstartsWith(prefix):指定した接頭辞で始まる単語が存在するか判定する動作イメージすべての入力は小文字の英字であると仮定します。例えば、次のようにメソ

  11. Pythonで配列内のK番目に大きい要素を求める方法

    問題の概要ソートされていない配列が与えられたとき、その中からk番目に大きい要素を見つける必要があります。例えば、配列が [3,2,1,5,6,4] で k = 2 の場合、2番目に大きい要素は「5」なので、結果は5となります。解決のアプローチこの問題は、以下の手順で解決できます。まず、配列の要素を昇順にソートします。kが1の場合は、最大値(配列の末尾の要素)をそのまま返します。それ以外の場合は、array[n - k] を返します。ここで n は配列のサイズです。ソート後の配列は昇順に並んでいるため、末尾から数えてk番目の位置、つまりインデックス n-k の要素が求める「k番目に大きい要素」と

  12. 【Python】二分探索木(BST)からK番目に小さい要素を求める方法

    二分探索木(BST:Binary Search Tree)が与えられたとき、その木の中でK番目に小さい要素を見つける問題を考えてみましょう。例として、次のような二分探索木があるとします。この木から3番目に小さい要素を求めたい場合は k = 3 となり、求める結果は 7 になります。解法のアプローチこの問題は、二分探索木の重要な性質を利用することで簡単に解けます。それは、BSTを中順走査(in-order traversal)すると、値が昇順に並んだリストが得られるというものです。具体的には、以下の手順で解きます。結果を格納するための空のリスト nodes を作成するsolve(root, no

  13. Pythonで二分木の最小共通祖先(LCA)を求める方法

    二分木が与えられたとき、指定した2つのノードの最小共通祖先(Lowest Common Ancestor:LCA)を求める問題を考えてみましょう。ノード p と q の LCA とは、p と q の両方を子孫として持つノードの中で、最も深い位置にあるノードのことです。 例えば、二分木が [3,5,1,6,2,0,8,null,null,7,4] という形式で表されている場合、木の構造は次のようになります。 この場合、ノード 5 と ノード 1 の LCA は 3 となります。 解法のアプローチ この問題は、再帰を使って次の手順で解くことができます。 木が空(None)の場合は、None

  14. 【Python】自身を除く配列要素の積を除算なしで求める方法

    問題の概要 n > 1 を満たす n 個の整数からなる配列 nums があるとします。ここで、output[i] が nums[i] 以外のすべての要素の積と等しくなるような配列 output を求めます。 例えば、入力配列が [1,2,3,4] の場合、出力は [24,12,8,6] となります。重要な制約として、この問題は除算演算子を使用せずに解く必要があります。 解法のアプローチ この問題は「右側からの累積積」と「左側からの累積積(プレフィックス)」を組み合わせることで効率的に解けます。各位置 i に対して、「左側の要素の積 × 右側の要素の積」を計算すればよいのです。 アルゴ

  15. Pythonでソート済み2D行列を効率的に検索する方法(Search a 2D Matrix II)

    問題の概要 m × n の行列が与えられたとき、その中から特定の値を効率的に検索するアルゴリズムを実装することを考えます。この行列には、以下のような性質があります。 各行の整数は、左から右に向かって昇順に並んでいる 各列の整数は、上から下に向かって昇順に並んでいる 行列の例 たとえば、次のような5×5の行列を考えてみましょう。 1471115 2581219 3691622 1013141724 1821232630 このとき、検索対象(target)が「5」であれば True を返し、「20」であれば False を返します。 アルゴリズムの考え方 この問題を効率的に解く鍵となるのは

  16. Pythonで配列内の重複する数値を検出する方法(フロイドの循環検出アルゴリズム)

    n + 1 個の整数を含む配列 nums があるとします。各要素は 1 から n の範囲に収まっており、鳩の巣原理により、少なくとも1つの重複した数値が必ず存在することが証明できます。ここでは重複している数値が1つだけであると仮定し、その重複要素を見つけることが課題となります。例えば、配列が [1,3,4,2,2] の場合、重複要素は 2 です。解決のための手順この問題は、フロイドの循環検出法(ウサギとカメのアルゴリズム)を応用することで、追加メモリ O(1) で効率的に解けます。手順は以下の通りです。a := nums[0]、b := nums[0] として初期化する無限ループを実行するa

  17. Pythonで最長増加部分列(LIS)を二分探索で効率的に求める方法

    ソートされていない整数のリストが与えられたとき、その中から「最長増加部分列(LIS:Longest Increasing Subsequence)」の長さを求める問題を考えてみましょう。 例えば、入力が [10, 9, 2, 5, 3, 7, 101, 18] の場合、増加する部分列としては [2, 3, 7, 101] が最長となるため、答えは 4 になります。 解法のアプローチ この問題は、単純な動的計画法でも O(n²) で解けますが、「tails(末尾管理用の配列)」と二分探索を組み合わせることで、O(n log n) という高速な計算量で解くことができます。 手順は以下の通りです。

  18. Pythonで連結リストを奇数番目・偶数番目のノードに並べ替える方法

    問題の概要片方向連結リスト(単方向リンクリスト)が与えられたとき、奇数番目のノードをすべて先頭に集め、その後に偶数番目のノードを続けるように並べ替えることを考えます。ここで重要なのは、「奇数・偶数」が指すのはノードが保持する値ではなく、リスト内でのノードの位置だという点です。さらに、余分なメモリを消費しないよう、インプレース(その場)で処理することが求められます。たとえば、ノードが [1, 22, 13, 14, 25] の場合、結果は [1, 13, 25, 22, 14] となります。1番目・3番目・5番目のノード(1, 13, 25)が前半に、2番目・4番目のノード(22, 14)が後半

  19. 【Python】長さ3の増加部分列(トリプレット)を判定するアルゴリズムを解説

    ソートされていない整数型の配列が与えられたとき、その中に「長さ3の増加部分列」が存在するかどうかを判定する問題を考えます。本記事では、Pythonを使ってこの問題を線形時間で解く効率的なアルゴリズムを紹介します。 問題の定義 正式には、この関数は以下の条件を満たす必要があります。 インデックス i、j、k が存在し、0 ≤ i < j < k ≤ n-1 の条件下で arr[i] < arr[j] < arr[k] を満たす場合は true を返す そのような組み合わせが存在しない場合は false を返す 解法のアプローチ この問題は、2つの変数 small と

  20. Pythonで最も頻出する上位K個の要素を求めるアルゴリズムを解説

    問題概要 空ではない整数型の配列が与えられたとき、その中で最も頻繁に出現する上位k個の要素を返すことを考えます。 例えば、要素が [1,1,1,1,2,2,3,3,3] で k = 2 の場合、結果は [1, 3] となります。 解法のアプローチ この問題は、ハッシュマップ(辞書)を2つ使うことで効率的に解くことができます。全体の流れは以下の通りです。 出現回数の記録: 各数値の出現回数を最初のマップに記録します。 頻度ごとのグループ化: 「出現回数」をキー、「その回数で出現した数値のリスト」を値とする2つ目のマップを作成します。 頻度の高い順に抽出: 配列の長さから降順にループし、該当する

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