【Python】文字列から2番目に大きい数字を抽出するプログラムの書き方
英数字で構成された文字列 s が与えられたとき、その中に現れる数字の中で2番目に大きい値を求める問題を考えてみましょう。該当する数字が存在しない場合は -1 を返します。
たとえば、入力が s = "p84t3ho1n" の場合、文字列に含まれる数字は [1, 3, 4, 8] なので、2番目に大きい数字は 4 となり、出力は 4 になります。
解決のためのアプローチ
この問題は、以下の手順で解くことができます。
- 重複を自動的に排除できるセット(set)を用意する
- 文字列内の各文字を走査し、数字以外の文字(アルファベットなど)は無視して、数字だけを整数に変換してセットに追加する
- セットの要素数が 1以下 の場合、2番目に大きい値が存在しないため
-1を返す - セットをソートし、後ろから2番目の要素(= 2番目に大きい値)を返す
セットを使うことで、同じ数字が複数回現れても自動的に一意化されるため、処理がシンプルになります。
実装例(Python)
def solve(s):
lst = set()
for let in s:
if not let.isalpha():
lst.add(int(let))
if len(lst) <= 1:
return -1
return sorted(list(lst))[len(lst) - 2]
s = "p84t3ho1n"
print(solve(s))入力
"p84t3ho1n"
出力
4
コードのポイント
isalpha()メソッドで文字がアルファベットかどうかを判定し、数字のみを抽出します。int(let)で文字型の数字を整数に変換してからセットに追加します。sorted()で昇順に並べ替えたリストの末尾から2番目の要素[len(lst) - 2]を取得することで、最大値ではなく「2番目に大きい値」を正しく返せます。
この手法なら、時間計算量は文字列の長さを n、含まれる数字の種類数を k とすると O(n + k log k) となり、非常に効率的です。ぜひ実際にコードを実行して、動作を確認してみてください。
-
Pythonでアナグラム単語の最大サブセットサイズを求める方法
小文字からなる単語のリストが与えられたとき、互いにアナグラムの関係にある文字列からなる最大サブセットのサイズを求めるのが本記事の課題です。アナグラムとは、一方の文字列がもう一方の文字列の並べ替え(文字の順番を入れ替えたもの)になっている関係を指します。たとえば、「python」と「typhon」はアナグラムです。Pythonでは、標準ライブラリのcollections.Counter()メソッドを活用することで、この問題を非常に効率的に解決できます。アルゴリズムの手順ステップ1:スペース区切りの入力文字列を単語ごとに分割する。ステップ2:リスト内の各文字列を文字順にソートする。ステップ3:Co
-
【Python】リストから最大値・最小値・2番目に大きい値・2番目に小さい値を求める方法
この記事では、Pythonを使ってリスト(配列)の中から最大値、最小値、2番目に大きい値(second largest)、2番目に小さい値(second smallest)を一度に見つけるプログラムを解説します。ソートを行わずに1回のループで処理できるのがポイントです。アルゴリズム全体の流れは以下の3ステップです。ステップ1:リストの要素を入力する ステップ2:各要素を取り出し、リスト内の他の数値と順に比較する ステップ3:最大値・最小値・2番目に大きい値・2番目に小さい値を取得して表示するサンプルコード# リスト内の最大値・最小値・2番目に大きい値・2番目に小さい値を求める def maxm