-
Pythonで数値の2進表現における連続する1の最長距離を求めるプログラム
整数 N が与えられたとき、その2進表現の中で隣り合う2つの「1」の間の最長距離を求めることを考えます。2つ以上の「1」が存在しない場合は 0 を返します。 たとえば入力が 71 の場合、出力は 4 になります。71 を2進数で表すと 1000111 であり、この中には「1」が4つ含まれています。先頭の「1」と2番目の「1」の間には3つの「0」が挟まれているため距離は 4 となり、それ以降の「1」同士はすべて距離 1 で隣接しています。したがって、この場合の最長距離は 4 です。 解法の考え方 この問題は、ビット列を左から順に走査しながら「1」が出現した位置を記録し、直前の「1」との距離を都
-
Pythonで最長の「素敵な」部分文字列(nice substring)を見つける方法
文字列 s が与えられたとき、その中から最長の「素敵な(nice)」部分文字列を見つける問題を考えてみましょう。ある文字列が「素敵」とみなされるのは、そこに含まれるすべての英字について、大文字と小文字が両方とも登場する場合です。条件を満たす部分文字列が複数存在するときは、最も早く出現するものを返します。 たとえば、入力が s = ZbybBbz の場合、答えは bBb になります。この部分文字列には大文字の B と小文字の b が両方含まれているためです。 アルゴリズムの流れ この問題は、開始位置と終了位置のすべての組み合わせを調べる総当たり(ブルートフォース)方式で解くことができます。手順は
-
Pythonで2つの文字列を交互にマージする方法を解説
2つの文字列 s と t があるとします。これらを、s の文字から始めて交互に1文字ずつ取り出しながら結合(マージ)することを考えます。もし2つの文字列の長さが異なる場合は、余った文字をそのままマージ後の文字列の末尾に追加します。 例えば、入力が s = major、t = general の場合、出力は mgaejnoerral になります。t の方が長いため、余りの部分である ral が末尾に追加されるためです。 解決の手順 この問題は、以下のステップで解決できます。 インデックス i と j をそれぞれ 0 で初期化する 結果を格納する空の文字列 result を用意する i が s
-
Pythonでルールに一致するアイテムをカウントするプログラムの実装方法
問題の概要 配列 items が与えられ、各要素 items[i] は [type_i, color_i, name_i] という3つの値を持つとします。これらは i 番目のアイテムの「種類(type)」「色(color)」「名前(name)」を表しています。 さらに、2つの文字列 ruleKey と ruleValue からなるルールが与えられます。i 番目のアイテムがこのルールに一致するのは、以下のいずれかの条件が成り立つ場合です。 ruleKey = type かつ ruleValue = type_i ruleKey = color かつ ruleValue = color_i ru
-
Pythonで同じx座標またはy座標を持つ最も近い点を見つけるプログラム
問題の概要ある配列 pts に複数の点が与えられているとします。さらに、現在位置を表す別の点 (x, y) も与えられています。ここで「有効な点」とは、現在位置と同じ x 座標、または同じ y 座標を共有する点と定義します。この中から、現在位置 (x, y) からのマンハッタン距離が最小となる有効な点のインデックスを返す必要があります。条件を満たす点が複数存在する場合は、インデックスが最も小さい点を返してください。注: 2点 (a, b) と (p, q) の間のマンハッタン距離は、|a − p| + |b − q| で表されます。例入力が次の場合:pts = [(1,2), (3,1), (
-
【Python】バイナリ文字列に「1」の連続セグメントが最大1つかどうかを判定するプログラム
問題の概要先頭にゼロが付いていないバイナリ文字列 s が与えられます。この文字列に「1」の連続したセグメント(区間)が最大でも1つしか含まれていないかどうかを判定する必要があります。たとえば、入力が s = 11100 の場合、「1」のセグメントは「111」の1つだけであるため、出力は True になります。一方、s = 110100 の場合は「11」と「1」という2つのセグメントが存在するため、出力は False となります。解決のアプローチこの問題は、次の手順で解くことができます。変数 count を -1 に初期化します。s の長さが1の場合は True を返します。s の各文字 i に
-
Pythonで1回の文字スワップにより2つの文字列を等しくできるか判定するプログラム
同じ長さの2つの文字列 s と t があるとします。ここで考える操作とは、ある文字列の中から2つのインデックス(必ずしも異なる必要はありません)を選び、その位置の文字同士を入れ替えることです。本記事では、どちらか一方の文字列に対して最大1回のスワップを実行することで、2つの文字列を同じにできるかどうかを判定する方法を解説します。 たとえば、入力が s = "hello"、t = "hlelo" の場合、どちらか一方の文字列で e と l を入れ替えるだけで2つの文字列が一致するため、出力は True になります。 アルゴリズムの流れ この問題は、以下の手
-
【Python】文字列から2番目に大きい数字を抽出するプログラムの書き方
英数字で構成された文字列 s が与えられたとき、その中に現れる数字の中で2番目に大きい値を求める問題を考えてみましょう。該当する数字が存在しない場合は -1 を返します。たとえば、入力が s = p84t3ho1n の場合、文字列に含まれる数字は [1, 3, 4, 8] なので、2番目に大きい数字は 4 となり、出力は 4 になります。解決のためのアプローチこの問題は、以下の手順で解くことができます。重複を自動的に排除できるセット(set)を用意する文字列内の各文字を走査し、数字以外の文字(アルファベットなど)は無視して、数字だけを整数に変換してセットに追加するセットの要素数が 1以下 の場
-
Pythonで昇順部分配列の最大合計を求めるプログラムの書き方
この記事では、正の値のみで構成された配列 nums が与えられたとき、その中に存在する「昇順の部分配列(サブアレイ)」の中で、合計が最大になるものを求める方法を解説します。問題の定義部分配列 [nums_l, nums_l+1, ..., nums_r-1, nums_r] が「昇順」であるとは、l <= i < r を満たすすべての i について nums[i] < nums[i+1] が成り立つことを指します。たとえば、入力が nums = [15, 25, 35, 5, 15, 55] の場合、出力は 75 になります。これは、[5, 15, 55] が合計値最大の昇順
-
Pythonで文字列内の異なる整数の個数を求めるプログラム
問題概要小文字の英数字から構成される文字列 s が与えられたとします。文字列中のすべての数字以外の文字を空白に置き換えると、少なくとも1つの空白で区切られた複数の整数が残ります。この置換操作を行った後、s に含まれる「異なる整数」の個数を求めるのが本問題です。ここで、2つの数値が「異なる」とみなされる条件は、先頭のゼロを取り除いた10進表現が互いに異なることです。具体例入力が s = ab12fg012th5er67 の場合、出力は 3 になります。理由を見てみましょう。置換後の文字列には [12, 012, 5, 67] という4つの数値が含まれます。12 と 012 は文字列としては別物で
-
Pythonでチェス盤のマスの色(白か黒か)を判定するプログラムの書き方
チェス盤上のあるマスの座標、つまり行と列の位置を表す文字列が与えられたとします。チェス盤のイメージは以下の通りです。この問題では、指定されたマスが白であるかどうかを判定し、白であれば True を、そうでなければ False を返す必要があります。例えば、入力が coordinate = f5 の場合、出力は True になります(上の画像を参照してください)。解決のアプローチこの問題は、文字のコード値(ASCIIコード)と行番号の偶奇に着目することで簡単に解けます。手順は以下の通りです。1文字目(列を表すアルファベット)のASCIIコードを2で割った余りと、2文字目(行を表す数字)を2で割っ
-
Pythonで文を切り詰めて最初のk個の単語を抽出するプログラムの書き方
問題の概要 単一のスペースで区切られた英語の単語を含む文 s があるとします(先頭や末尾に余分なスペースはないものとします)。さらに、整数値 k も与えられます。このとき、文を切り詰めて、最初の k 個の単語のみを取得する必要があります。 例 例えば、入力が以下のような場合を考えてみましょう。 s = Coding challenges are really helpful for students k = 5 この場合、出力は次のようになります。 Coding challenges are really helpful 解決アプローチ この問題は、以下の手順で解決できます。 split
-
Pythonで配列の全要素の積の符号を判定するプログラム
nums という整数型の配列があるとします。この課題では、配列に含まれるすべての要素を掛け合わせた結果の符号を求める必要があります。例えば、入力が nums = [-2,3,6,-9,2,-4] の場合、すべての要素の積は -2592 になるため、出力は「Negative(負)」となります。解決のアプローチこの問題は、実際にすべての要素を掛け合わせなくても解くことができます。次の手順に従います。ゼロの個数を数える変数 zeroes と、負の数の個数を数える変数 negatives をそれぞれ 0 で初期化します。配列 nums の各要素 i に対して、以下の処理を行います。i が 0 と等しい
-
Pythonで配列を厳密に増加させるための最小操作回数を求めるプログラム
問題の概要 配列 nums が与えられているとします。1回の操作では、配列内の任意の要素を1つ選び、その値を1だけ増やすことができます。例えば、[4,5,6] という配列でインデックス1の要素に対して操作を行うと、[4,6,6] になります。 このとき、nums を厳密に増加する配列(すべての要素が直前の要素よりも必ず大きい状態)にするために必要な、最小の操作回数を求めるのが目的です。 例えば、入力が nums = [8,5,7] の場合、出力は 7 になります。これは次のような手順で要素を増やしていく必要があるためです。 [8,6,7] → [8,7,7] → [8,8,7] → [8,9,
-
Pythonで文章がパングラムかどうかを判定するプログラムの作成方法
小文字の英字のみで構成された文字列 s が与えられます。この文字列がパングラム(pangram)であるかどうかを判定するプログラムを作成しましょう。パングラムとは、英語アルファベットの26文字すべてを少なくとも1回含む文字列のことです。有名な例としては「The quick brown fox jumps over the lazy dog」が挙げられます。 たとえば、入力が s = thegrumpywizardmakestoxicbrewfortheevilqueenandjack の場合、a〜zのすべての文字が含まれているため、出力は True となります。 解決のアプローチ この問題は、
-
Pythonで基数Kに変換した数値の桁の合計を求める方法
問題の概要10進数(基数10)で表された数値 n と、別の基数 k が与えられたとします。このとき、n を基数10から基数 k に変換した後の各桁の合計を求める必要があります。桁の合計を計算する際には、各桁を通常の10進数として扱う点に注意してください。例えば、入力が n = 985、k = 8 の場合を考えてみましょう。985 を8進数に変換すると「1731」になります。したがって、桁の合計は 1 + 7 + 3 + 1 = 12 となります。解法のアルゴリズムこの問題は、基数変換の仕組みを利用することで簡単に解けます。手順は以下の通りです。答えを格納する変数 ans を 0 で初期化します
-
Pythonで文字列内のすべての数字を文字に置き換える方法
問題の概要 小文字の英字と数字が交互に並んだ英数字文字列 s を考えてみましょう。偶数番目の位置には小文字の英字が、奇数番目の位置には数字が含まれています。 ここで、任意の文字 c と数値 x を受け取り、「c の x 番後の文字」を返す操作 shift(c, x) を定義します。たとえば shift(p, 5) = u、shift(a, 0) = a のようになります。 この問題では、すべての奇数インデックス i にある数字 s[i] を shift(s[i-1], s[i]) の結果で置き換え、すべての数字を置き換え終えた後の文字列を求めます。 入力例 s = a2b1d4f3h2 出
-
Pythonでターゲット要素までの最小距離を求めるプログラムの解説
配列 nums と、2つの異なる値 target(nums 内に必ず存在する)および start が与えられたとします。このとき、nums[i] = target を満たすインデックス i の中から |i - start| が最小になるものを見つけ、その値を返すのが課題です。例として、入力が nums = [3,4,5,6,7]、target = 7、start = 2 の場合を考えてみましょう。ターゲットに一致する値は nums[4] の1つだけなので i = 4 となり、|4 - 2| = 2 が出力されます。解法のアプローチこの問題は、配列を先頭から順に走査しながら、ターゲットと一致する
-
Pythonで最大人口となる年を求めるプログラムの書き方
問題の概要ここでは、birth(出生年)と death(死亡年)の2列を持つ表を考えます。各行は i 番目の人物の出生年と死亡年を表しています。ある年 y の「人口」とは、その年に生存している人数のことです。i 番目の人物は、y が閉区間 [birth_i, death_i − 1] に含まれる場合に、年 y の人口としてカウントされます(死亡した当年は数えません)。この条件のもとで、人口が最大となる年のうち、最も早い年を求めるのが目的です。入力例BirthDeath197020101960202019401970この場合、出力は 1960 になります。1960年には2人(1960年生まれ〜2
-
Pythonで合計がターゲットに一致する重複しない2つの部分配列を見つけるプログラム
問題の概要配列 arr と整数 target が与えられたとします。ここで、arr の中から互いに重なり合わない2つの部分配列を見つけ、それぞれの要素の合計が target と一致するようにします。条件を満たす組み合わせが複数存在する場合は、2つの部分配列の長さの合計が最小になるものを選択します。求める答えはその長さの合計の最小値であり、該当する部分配列が存在しない場合は -1 を返します。例として、入力が arr = [5,2,6,3,2,5]、target = 5 の場合を考えてみましょう。合計が 5 になる部分配列には [5]、[3,2]、[5] の3つがあります。この中から重ならない2