-
Pythonで配列内の2つの異なる要素の最大積を求める方法
数値のリスト nums が与えられたとき、その中から2つの異なる要素を選んで掛け合わせた値の最大値(最大積)を求めたい場面はよくあります。例えば、入力が nums = [8, -3, 1, -5] の場合、出力は 15 となります。これは (-3) × (-5) = 15 となり、他のどの組み合わせよりも大きいためです。ポイント:負の数同士の積に注意この問題で重要なのは、負の数同士を掛けると正の数になるという性質です。そのため、最大の積は以下の2パターンのいずれかから生まれます。リスト内の最も大きい2つの要素の積リスト内の最も小さい(負の)2つの要素の積したがって、リストをソートして両端の組み
-
Pythonで数値の任意の位置に5を挿入して最大値を求める方法
整数 n が与えられたとき、数字「5」を任意の位置に1つ挿入することで得られる最大の数を求める問題を考えてみましょう。例えば、n = 834 の場合、出力は 8534 になります。これは「8」と「3」の間に「5」を挿入した結果です。解法のアプローチこの問題を解くためには、以下の手順に従います。n が正の数の場合:s := n を文字列に変換k := 空の文字列c := False(挿入済みフラグ)s の各文字 i について繰り返し処理を行う:i が「5」未満かつ c が False の場合:k := k + 5 + ic := Trueそれ以外の場合:k := k + ik を整数として返すn
-
Pythonで長さkの部分リストを1つ削除した後の最小振幅を求めるプログラム
数値のリスト nums と整数 k が与えられます。まずサイズ k の部分リスト(連続する区間)をひとつだけ取り除いたとき、残ったリストにおける「最大値 − 最小値」、すなわち振幅(amplitude)が最も小さくなるような削除方法を求めます。 問題の具体例 たとえば nums = [2, 3, 10, 9, 8, 4]、k = 3 の場合を考えてみます。[10, 9, 8] を取り除くと、残りのリストは [2, 3, 4] となり、振幅は 4 − 2 = 2 になります。これがこの入力に対する答えです。 解法のアプローチ すべての削除位置について毎回最大値と最小値を計算し直すと、計算量は
-
PythonでK個の要素を削除した後に最小振幅を求める方法
問題の概要 数値のリスト nums と整数 k が与えられます。nums からちょうど k 個の要素を削除したとき、残りの要素における「最大値 − 最小値」の差(振幅)が最小になるようにするには、どの要素を削除すればよいのでしょうか。 たとえば、入力が nums = [4, 10, 3, 2, 8, 9]、k = 3 の場合、出力は 2 になります。10・8・9 を削除すると残りは [2, 3, 4] となり、最大値は 4、最小値は 2 なので、差は 2 になるためです。 解法のアプローチ この問題は「ソート+スライディングウィンドウ」の考え方で効率的に解けます。k 個の要素を削除すると n
-
Pythonでテキスト内の2つの単語間の最小距離を求める方法を解説
はじめに文字列処理の問題の中でも頻出するテーマの一つが、「文章中に出現する2つの単語の距離を求める」というものです。本記事では、Pythonを使って、テキスト(文)内に含まれる2つの単語 w1 と w2 の出現位置のうち、最も近いもの同士の距離を求めるプログラムを紹介します。ここでの「距離」は、2つの単語の間に存在する単語数として定義します。また、どちらか一方の単語がテキスト中に存在しない場合は -1 を返す仕様とします。問題の定義3つの文字列 text、w1、w2 が与えられます。text は複数の単語から構成される文章です。このとき、w1 と w2 の任意の出現ペアの中で最小となる距離(間
-
Pythonで接頭辞和がすべて正になるように先頭へ挿入する最小の値を求めるプログラム
数値のリスト nums が与えられたとします。このリストの先頭に挿入することで、結果として得られるリストの接頭辞和(プレフィックスサム)がすべて0より大きくなるような、最小の正の値を求めるのがこの問題の目的です。問題の例たとえば、入力が nums = [3, -6, 4, 3] の場合、出力は 4 になります。これは、4 をリストの先頭に挿入すると [4, 3, -6, 4, 3] となり、その接頭辞和は [4, 7, 1, 5, 8] となって、すべての値が0より大きくなるためです。解法のアプローチこの問題は、次の手順で効率的に解くことができます。リスト nums の先頭(インデックス0)に
-
Pythonで文字列を単調な部分文字列に分割する最小数を求める方法
問題概要 小文字のみで構成された文字列 s が与えられます。この文字列を、各部分文字列が「非減少」または「非増加」のいずれかを満たすように分割するとき、必要な連続部分文字列の最小個数を求めます。 例えば、「pqqqr」は非減少文字列、「qqqp」は非増加文字列です。 入出力の例 入力が s = pqrsrqp の場合、出力は 2 になります。「pqrs」(非減少)と「rqp」(非増加)という2つの部分文字列に分割できるためです。 解法のアプローチ この問題は、文字列を左から右へ走査しながら、昇順と降順の方向が切り替わる箇所を検出することで解けます。具体的には、以下の手順に従います。 s が空
-
Pythonでフォロー関係リストから相互フォロワーを見つける方法
問題の概要「relations」というリストがあると仮定します。このリストの各要素 relations[i] は2つの数値 [ai, bi] からなり、ソーシャルメディア上で「人物 ai が人物 bi をフォローしている」ことを表しています。ここで、互いにフォローし合っている人々(相互フォロワー)の一覧を求め、昇順にソートして返す必要があります。たとえば、入力が relations = [[0, 2], [2, 3], [2, 0], [1, 0]] の場合、出力は [0, 2] となります。解決のための手順この問題は、次の手順で解くことができます。空のセット ans と seen を用意しま
-
Pythonで小文字のみを考慮して文字列が回文かどうかを判定するプログラム
問題概要英数字からなる文字列 s が与えられます。この文字列には大文字と小文字の両方が混在している可能性があります。ここで、小文字のアルファベットのみに着目し、文字列 s が回文(前から読んでも後ろから読んでも同じ並びになる文字列)であるかどうかを判定するプログラムを作成しましょう。入力例と出力例たとえば、入力が s = rLacHEec0a2r8 の場合、出力は True になります。これは、この文字列から小文字だけを取り出すと「racecar」となり、回文であるためです。解法のアプローチこの問題は、以下の手順で解くことができます。空の文字列 x を用意します。文字列 s 内の各文字 i に
-
Pythonで数値文字列がペア1つとトリプル複数個に並べ替え可能か判定する方法
問題概要数値文字列 s が与えられます。この文字列を並べ替えて、「同じ数字2つからなるペア」をちょうど1つ作り、残りの部分をすべて「同じ数字3つからなるトリプル」に分割できるかどうかを判定します。例えば、入力が s = 21133123 の場合、出力は True になります。「2」が2つあるので「22」というペアを作ることができ、残りの「111」「333」がそれぞれトリプルとして成立するためです。解き方のアプローチこの問題は、次の手順で解決できます。文字列に含まれる各数字の出現回数をカウントする(Counter を使用)。各数字 k について、そのカウントから2を減らして「ペアを作る」状況をシ
-
Pythonで要素の合計が2の累乗になるインデックスペアの数を数えるプログラム
問題の概要数値のリスト nums が与えられたとします。このとき、i < j を満たすインデックスのペア (i, j) のうち、nums[i] + nums[j] が 2 の累乗(2^k、k ≥ 0)と等しくなるものの個数を求めます。例えば、入力が nums = [1, 2, 6, 3, 5] の場合、出力は 3 になります。これは、合計が 2 の累乗となるペアが次の 3 つ存在するためです。(2, 6):合計は 8(3, 5):合計は 8(1, 3):合計は 4解決のためのアプローチこの問題を効率よく解くために、以下の手順に従います。結果を格納する変数 res を 0 で初期化します。
-
【Python】文字列を使わずに数値が回文(パリンドローム)かどうかを判定するプログラム
本記事では、非負整数 num が与えられたとき、その数値が回文(パリンドローム)であるかどうかを判定する方法を解説します。ポイントは、文字列変換を一切使わずに数値演算だけで解くことです。たとえば、入力が num = 25352 の場合、前から読んでも後ろから読んでも「25352」で同じになるため、出力は True になります。アルゴリズムの考え方文字列に変換せずに回文を判定するには、数値そのものを逆順に組み立て直すという手法を使います。具体的には、剰余演算(% 10)で下の桁から1桁ずつ取り出し、それを別の変数の末尾に付け加えていくことで、元の数値の反転を作れます。手順a := 0(反転結果を
-
Python Pandas:開いた端点を共有する2つのIntervalオブジェクトが重なるかどうかを確認する方法
開いた端点を共有する2つのIntervalオブジェクトが重なっているかどうかを確認するには、overlaps()メソッドを使用します。 Pandasにおける区間の重複判定のルールはシンプルです。2つの区間が「共通の点」を持つ場合、その点が閉じた端点であれば重なっているとみなされます。しかし、開いた端点しか共有していない場合、その点はどちらの区間にも実際には含まれていないため、重なっているとは判断されません。 必要なライブラリのインポート まず、必要なライブラリをインポートします。 import pandas as pd Intervalオブジェクトの作成 2つのIntervalオブジェクト
-
Python Pandasで区間(Interval)の右側の境界を取得する方法
区間(Interval)の右側の境界を取得するには、interval.right プロパティを使用します。この記事では、Timestamp を境界とした時間区間から右側の境界値を取得する手順を、具体的なコード例とともに解説します。必要なライブラリのインポートまず、pandas をインポートします。import pandas as pd時間区間の作成pd.Timestamp を左右の境界として時間区間を作成します。"closed" パラメータに "left" を指定すると、左側は含み右側は含まない「左閉・右開」の区間になります。interval = pd.
-
Pythonで区間データ用のPandas配列(IntervalArray)を作成する方法
区間(インターバル)データを扱うためのPandas配列を作成するには、pandas.arrays.IntervalArray()メソッドを使用します。IntervalArrayは複数の区間をひとつの配列として格納できるクラスで、時間帯や数値範囲などのデータをまとめて管理・分析したい場合に非常に便利です。 1. 必要なライブラリをインポートする まずは、必要なライブラリをインポートしましょう。 import pandas as pd 2. Intervalオブジェクトを作成する 次に、2つのIntervalオブジェクトを作成します。第1引数に区間の下限値、第2引数に上限値を指定します。デフォルト
-
Python Pandas – IntervalArrayの各区間の左端をインデックスとして取得する方法
PandasのIntervalArrayに含まれる各区間(Interval)の左端(始点)をインデックス(Index)として取得するには、array.leftプロパティを使用します。このプロパティは、各Intervalの左側の境界値をまとめたインデックスを返します。 必要なライブラリのインポート まず、必要なライブラリをインポートします。 import pandas as pd Intervalオブジェクトの作成 2つのIntervalオブジェクトを作成します。 interval1 = pd.Interval(10, 25) interval2 = pd.Interval(15, 70) 作成
-
Python Pandas – IntervalArray内の各区間の右端をインデックスとして取得する方法
PandasのIntervalArrayに含まれる各区間(Interval)の右端(右エンドポイント)をインデックス(Index)として取得するには、array.rightプロパティを使用します。このプロパティは、各区間の右側の境界値をまとめたIndexオブジェクトを返します。なお、pd.Interval(10, 25)のように作成した区間は「左開・右閉」の区間(10, 25]となるため、右端の値はその区間に含まれる点にも注意してください。手順1:ライブラリのインポートまず、必要なライブラリをインポートします。import pandas as pd手順2:Intervalオブジェクトの作成2つ
-
Python Pandas – IntervalArrayの区間が左側・右側・両側・非閉のどれで閉じているかを確認する方法
IntervalArray内の区間(インターバル)が、左側・右側・両側のいずれで閉じているのか、あるいはどちらでも閉じていないのかを確認するには、array.closedプロパティを使用します。このプロパティは、配列内のすべての区間に共通する「閉じ」の設定を文字列として返します。必要なライブラリのインポートまず、必要なライブラリをインポートします。import pandas as pdIntervalオブジェクトの作成次に、2つのIntervalオブジェクトを作成します。「closed」パラメータに「both」を指定することで、両側が閉じた区間を設定できます。閉区間とは、数学において角括弧 [
-
Python Pandas – IntervalArray内の各区間の中点をIndexとして取得する方法
IntervalArray内の各区間(Interval)の中点をIndexとして取得するには、array.midプロパティを使用します。このプロパティは、IntervalArrayに含まれる各区間の中点を要素とするIndexを返します。必要なライブラリのインポートまず、必要なライブラリをインポートします。import pandas as pdIntervalオブジェクトの作成次に、2つのIntervalオブジェクトを作成します。「closed」パラメータに「both」を指定すると、両端を含む閉区間として設定されます。interval1 = pd.Interval(50, 75, closed=
-
Python Pandas入門:IntervalArrayの各区間の長さを取得してIndexとして返す方法
IntervalArray(区間配列)に含まれる各区間(Interval)の長さを示すエントリを持つ Index を返したい場合は、array.length プロパティを使用します。このプロパティを呼び出すことで、配列内のすべての区間の長さが一括して計算され、Int64型の Index として取得できます。必要なライブラリのインポートまず、必要なライブラリをインポートします。import pandas as pdIntervalオブジェクトの作成次に、2つの Interval オブジェクトを作成します。「closed」パラメータに「both」を指定すると、両端を含む閉区間として設定されます。i