-
Pythonで連結リストのm個のノードを保持した後にn個のノードを削除するプログラム
始点ノードが「head」である連結リストと、2つの整数 m と n が与えられたとします。リストを走査しながら、先頭から数えて m 個のノードを残した直後の n 個のノードを削除する処理を、連結リストの末尾に到達するまで繰り返します。処理は head ノードから開始し、最後に変更後の連結リストを返します。今回扱う連結リストの構造は次のように定義されています。Node value : <整数値> next : <次のノードへのポインタ>例えば、入力が elements = [1, 2, 3, 4, 5, 6, 7, 8]、m = 3、n = 1 の場合、出
-
Pythonで特別割引セールの最終支払額を求めるプログラムの書き方
「prices」という配列があるとします。ここで prices[i] は、店で販売されている i 番目の商品の価格を表します。現在この店では特別なセールが実施されており、i 番目の商品を購入すると、「j > i を満たす最小のインデックス j であり、かつ prices[j] <= prices[i](j 番目の商品の価格が i 番目の商品の価格以下)」という条件を満たす商品が存在する場合、その prices[j] に相当する金額の割引を受けられます。該当する商品が存在しない場合は、割引は一切適用されません。 この記事では、この特別割引を考慮したうえで、i 番目の商品に対して実際に
-
Pythonで1次元配列の累積和(ランニングサム)を求める方法
問題の概要配列 nums が与えられたとします。配列の「ランニングサム(累積和)」とは、rs[i] が nums[0] から nums[i] までのすべての要素の合計を表す新しい配列のことです。最終的には、nums 全体のランニングサムを返します。例えば、入力が nums = [8,3,6,2,1,4,5] の場合、出力は [8, 11, 17, 19, 20, 24, 29] となります。その理由は以下の通りです。rs[0] = nums[0] rs[1] = nums[0..1] の合計 = 8 + 3 = 11 rs[2] = nums[0..2] の合計 = 8 + 3 + 6 = 1
-
Pythonで配列の全要素のXOR(排他的論理和)を計算するプログラム
問題概要 整数 n と整数 start が与えられます。ここで、nums[i] = start + 2*i(i は 0 から開始)という規則に従う配列 nums を作成します。配列のサイズは n です。そして、配列内のすべての要素のビットごとの XOR(排他的論理和)を求めます。 たとえば、入力が n = 6、start = 2 の場合、出力は 14 になります。配列は [2+2*0, 2+2*1, ... , 2+2*5]、すなわち [2, 4, 6, 8, 10, 12] となり、これらの要素すべてを XOR すると 14 になるためです。 解き方の手順 この問題を解くには、次の手順に従い
-
Pythonで最低給与と最高給与を除いた平均給与を求めるプログラムの作成方法
問題の概要 各要素が重複しない整数型の配列 salary があるとします。salary[i] は i 番目の従業員の給与を表しています。ここで求めたいのは、最低給与と最高給与を除外した場合の平均給与です。 例えば、入力が salary = [8000, 6000, 2000, 8500, 2500, 4000] の場合を考えてみましょう。このとき、最低値は 2000、最高値は 8500 なので、これらを除いた [8000, 6000, 2500, 4000] の平均を計算します。 計算式は次のようになります。 (8000 + 6000 + 2500 + 4000) / 4 = 5125.0
-
Pythonでリストの要素が等差数列(AP)を形成しているか判定するプログラム
はじめに数値のリスト nums が与えられたとき、その要素が等差数列(Arithmetic Progression:AP)を形成しているかどうかを判定するプログラムを作成します。等差数列とは、隣り合う任意の2つの要素の差(公差)が常に一定である数列のことです。例えば、入力が nums = [9,1,17,5,13] の場合、要素を昇順にソートすると [1,5,9,13,17] となり、隣接する要素同士の差はすべて4で一定です。したがって、この場合の出力は True になります。解決の手順この問題は、以下の手順で解くことができます。リスト nums を昇順にソートします。nums の要素数が1よ
-
Pythonで日付文字列をYYYY-MM-DD形式に変換する方法【サンプルコード付き】
Pythonでは、「23rd Jan 2021」のような日付文字列を標準的な「YYYY-MM-DD」形式に変換したい場面がよくあります。本記事では、日が「1st、2nd、…、30th、31st」といった序数表現、月が「Jan、Feb、…、Nov、Dec」といった英語略称、年が1900〜2100の範囲の4桁の数値で構成される日付文字列を想定し、これを「YYYY-MM-DD」形式へ変換するプログラムを解説します。 例えば、入力が date = 23rd Jan 2021 の場合、出力は 2021-01-23 となります。 変換の手順 この問題は、以下の手順で解決できます。 月名のリスト Mont
-
Pythonで配列内の「良いペア」の数を数えるプログラム
問題の概要整数の配列 nums が与えられたとします。ここで、ペア (i, j) は nums[i] と nums[j] の値が等しく、かつ i < j を満たすときに「良いペア(good pair)」と定義されます。この記事では、配列の中に良いペアがいくつ存在するかを数える方法を解説します。例えば、入力が nums = [5,6,7,5,5,7] の場合、出力は 4 になります。これは、インデックスの組み合わせ (0, 3)、(0, 4)、(3, 4)、(2, 5) の4つが条件を満たすためです。解き方の手順基本的なアプローチは、すべてのペアの組み合わせを調べて条件に一致するものをカウ
-
Pythonで飲めるウォーターボトルの最大本数を求めるプログラム
問題概要満杯の水ボトルが n 本あるとします。ここで、空きボトル m 個 を交換すると満杯のボトル 1 本と引き換えられるというルールがあります。満杯のボトルを飲むと、そのボトルは空きボトルになります。このとき、合計で最大何本の水ボトルを飲めるかを求めるのがこの問題です。具体例たとえば、入力が n = 9、m = 3 の場合、出力は 13 になります。その理由は以下の通りです。最初に 9 本の満杯ボトルがあり、すべて飲むと 9 本の空きボトルになります。9 ÷ 3 = 3 なので、空きボトル 9 個から満杯ボトル 3 本と交換できます。その 3 本をすべて飲むと、再び空きボトルが 3 個手に入
-
Pythonで指定した区間内の奇数の個数を数えるプログラム
2つの非負整数 left と right が与えられたとき、この2つの値の間(両端を含む)に存在する奇数がいくつあるかを求める問題を考えてみましょう。 例えば、left = 3、right = 15 が入力された場合、出力は 7 になります。これは、この範囲に含まれる奇数が [3, 5, 7, 9, 11, 13, 15] の7個だからです。 解法のアプローチ この問題は、範囲内のすべての数を1つずつ確認しなくても、数学的な性質を利用すれば定数時間(O(1))で解くことができます。手順は以下の通りです。 left または right のどちらか一方でも奇数である場合:(right - lef
-
Pythonで指定されたインデックスに基づいて文字列をシャッフルする方法
文字列 s とインデックスのリスト ind が与えられ、両者は同じ長さであるとします。文字列 s は、位置 i にある文字が最終的な文字列内の ind[i] の位置へ移動するようにシャッフルされます。このとき、シャッフル後の最終的な文字列を求める必要があります。例えば、入力が s = ktoalak、ind = [0,5,1,6,2,4,3] の場合、出力は kolkata となります。解決手順この問題を解くには、以下の手順に従います。fin_str を s と同じサイズのリストとして作成し、0で初期化するs 内の各インデックス i と各文字 v に対して、次の操作を行うfin_str[ind
-
Pythonで「良いトリプレット」の数を数えるプログラムの書き方
問題概要配列 nums と、3つの異なる整数 a、b、c が与えられます。このとき、条件を満たす「良いトリプレット(good triplet)」の個数を求めるのが目的です。トリプレット (nums[i], nums[j], nums[k]) が良いトリプレットとみなされるのは、以下の条件をすべて満たす場合です。0 <= i < j < k < nums の要素数|nums[i] − nums[j]| <= a|nums[j] − nums[k]| <= b|nums[i] − nums[k]| <= cたとえば、nums = [5,2,3,3,12,9
-
Pythonで配列からk番目に欠落している正の整数を見つける方法
問題の概要 厳密に増加する正の整数が昇順に並んだ配列 nums と、整数 k が与えられます。このとき、配列に含まれていない正の整数の中から k 番目のものを求めるのが目的です。 例として、nums = [1,2,4,8,12]、k = 6 の場合を考えてみましょう。この配列に存在しない数は [3,5,6,7,9,10,11] であり、その中で 6 番目に当たるのは 10 です。したがって、出力は 10 となります。 解法のアプローチ この問題は、次の手順で解くことができます。 配列 nums の要素をセット(set)に変換し、要素の存在判定を高速化します。 カウンタ count を 0、
-
Pythonで大文字・小文字の隣接ペアを削除して「良い文字列」を作るプログラム
問題の概要 英小文字と英大文字で構成された文字列 s が与えられます。次の両方の条件を満たす隣接する2文字 s[i] と s[i + 1] が一切含まれていない文字列を「良い文字列(good string)」と定義します。 0 <= i <= len(s) - 2 s[i] が小文字で、s[i + 1] が同じ英字の大文字である(またはその逆) 文字列を良い文字列へ変換するには、文字列を「悪い」状態にしている隣接する2文字を選んで削除します。この操作を、文字列が良くなるまで繰り返します(空文字列も良い文字列とみなします)。そして、最終的に得られる文字列を求めます。 入力例 た
-
Pythonで3つ連続した奇数が存在するかどうかを判定するプログラム
nums という整数型の配列が与えられたとき、その中に「3つ連続した奇数」が存在するかどうかを判定するプログラムを作成します。 たとえば、入力が nums = [18,15,2,19,3,11,17,25,20] の場合、[3, 11, 17] という3つの連続した奇数が含まれているため、出力は True になります。 解決のためのアプローチ この問題は、以下の手順で解くことができます。 length := 配列 nums の要素数とします。 length が 1 または 2 の場合は、3つ連続した奇数が存在し得ないため False を返します。 それ以外の場合は、i を 0 から「要素数
-
Pythonで数値を3桁区切り(カンマ区切り)の文字列に変換するプログラム
数値 n が与えられたとき、その数値を3桁ごとにカンマ(,)で区切った文字列形式に変換して返すことを考えます。例えば、入力が n = 512462687 の場合、出力は 512,462,687 となります。これは金額や大きな数値を見やすく表示したい場面でよく使われる処理です。解決の手順この問題は、以下のステップで解決できます。まず n を文字列に変換し、res としますres を反転させます結果を格納するための空文字列 ans を用意しますi を 0 から res の長さ - 1 まで繰り返しますi を 3 で割った余りが 0 かつ i が 0 でない場合、ans にカンマ「,」を連結しますa
-
Pythonで循環トラック上のレースにおける最も訪問されたセクターを見つける方法
数字 n と配列 rounds があるとします。ここで、1 から n までの番号が付けられた n 個の異なるセクターで構成される円形トラックを考えます。このトラックでレースが開催され、レースは m ラウンドで構成されています。i 番目のラウンドはセクター rounds[i - 1] から開始し、セクター rounds[i] で終了します。たとえば、第 1 ラウンドはセクター rounds[0] から始まり、rounds[1] で終わります。 私たちのタスクは、最も多く訪問されたセクターを昇順で求めることです。(トラックの番号は反時計回りの方向でセクター番号の昇順に配置されているものとします)
-
Pythonで配列内にk回以上繰り返される長さmのパターンが存在するかを判定する方法
正の整数からなる配列 nums が与えられたとき、長さ m のパターンが k 回以上繰り返されているかどうかを判定する問題を考えてみましょう。ここでいう「パターン」とは、1つ以上の値からなる連続した(重なり合わない)部分配列であり、複数回繰り返されるものを指します。つまり、配列の中に長さ m の連続する部分列が k 回以上出現しているかを確認する必要があります。 例として、nums = [3,5,1,4,3,1,4,3,1,4,3,9,6,1]、m = 3、k = 2 が入力された場合、出力は True になります。これは、パターン [1,4,3] が配列内に3回出現しているためです。 解法の
-
Pythonで行列の対角線上の要素の合計を求めるプログラム
問題の概要正方行列が与えられたとき、その対角線上の要素の合計を求めることを考えます。具体的には、主対角線(左上から右下)と副対角線(右上から左下)に含まれるすべての要素を足し合わせます。ただし、奇数次の行列では2つの対角線が交差する中央の要素が重複するため、その要素は1回だけカウントする必要があります。たとえば、次のような4×4の行列が入力として与えられたとします。10596815323812321173この場合の出力は 59 になります。内訳を見ると、主対角線の要素は [10, 15, 12, 3] でその合計は 40、副対角線の要素は [6, 3, 8, 2] でその合計は 19 です。し
-
Pythonで連続する同じ文字を避けながら「?」を置き換えるプログラムの実装方法
問題の概要小文字のアルファベットと「?」のみで構成された文字列 s が与えられたとします。ここで、すべての「?」を小文字のアルファベットに置き換え、最終的な文字列の中に同じ文字が連続して現れないようにする必要があります。条件を満たす答えが複数存在する場合は、そのうちのどれか1つを返せば構いません。例えば、入力が s = "hel??" の場合、出力は helab になります。1つ目の「?」には「l」以外の任意の文字を割り当てることができ、1つ目が確定した後は、2つ目の「?」には直前の文字(この場合は「a」)以外の任意の文字を割り当てます。解法の考え方この問題は、文字列を先頭