Pythonで連続するk桁の数字の最大積を求める方法
2つの整数 num と k が与えられたとき、num の中で連続する k 桁の数字を取り出し、その積が最大となる組み合わせを求める問題を考えます。なお、num は必ず k 桁以上の数字を持つことが保証されています。
問題の例
例えば、num = 52689762、k = 4 の場合を考えてみましょう。このときの出力は 3024 になります。これは、4桁の連続した数字の組み合わせの中で「8 × 9 × 7 × 6 = 3024」が最大の積となるためです。
解法のアプローチ
この問題は、以下の手順で解くことができます。
- 変数
largestを 0 で初期化します numを 10 の (k-1) 乗で割った商が 0 より大きい間、次の処理を繰り返しますdigitsにnumの下位 k 桁を取り出して代入します- 候補値
candを 1 で初期化します digitsが 0 より大きい間、次の処理を繰り返しますcandにdigitsの最下位桁を掛け合わせますcandが 0 になった場合は、それ以上計算しても結果が 0 のままであるため、ループを抜けて無駄な計算を省きますdigitsを 10 で割って、次の桁へ処理を進めます
largestとcandのうち大きい方をlargestに代入しますnumを 10 で割って、探索範囲を1桁ずつずらします
- 最後に
largestを返します
このアルゴリズムでは、数値の右端から1桁ずつずらしながら k 桁分の数字を取り出し、それぞれの積を計算して最大値を更新していきます。途中で 0 が出現した時点で積が必ず 0 になるため、早期にループを抜けることで計算効率を高めているのがポイントです。
実装例
それでは、実際のPythonコードを見てみましょう。
class Solution: def solve(self, num, k): largest = 0 while num // 10 ** (k - 1) > 0: digits = num % 10 ** k cand = 1 while digits > 0: cand *= digits % 10 if cand == 0: break digits //= 10 largest = max(largest, cand) num //= 10 return largest ob = Solution() num = 52689762 k = 4 print(ob.solve(num, k))
入力
52689762, 4
出力
3024
コードのポイント
num // 10 ** (k - 1) > 0:まだ k 桁分の数字が残っているかどうかを判定する継続条件ですnum % 10 ** k:現在のnumから下位 k 桁を取り出すために使っていますcand == 0のチェック:0 を含む組み合わせの積は必ず 0 になるため、即座に打ち切ることで効率化を実現しています
このように、剰余演算と整数除算を組み合わせることで、文字列への変換を行わずに数値のまま各桁を操作できるのが特徴です。計算量は桁数と k に依存しますが、シンプルで読みやすい実装となっています。
-
Pythonで点のリストから作れる最大の三角形の面積を求める方法
平面上に与えられた点のリストの中から、任意の3点を選んで作ることができる三角形のうち、最も大きな面積を持つものを求める問題です。例えば、入力が [[0,0],[0,1],[1,0],[0,2],[2,0]] の場合、出力は 2 となります。解法のアプローチこの問題は、すべての3点の組み合わせについて三角形の面積を計算し、その最大値を求めることで解けます。手順は以下の通りです。結果を格納する変数 res を 0 で初期化する点のリストのサイズを N とする三重ループで、i、j、k の3つのインデックスの組み合わせをすべて列挙する(i < j < k)各組み合わせに対して、3点の座標
-
Pythonで解くヒストグラム内の最大長方形|スタックによる効率的な解法
問題の概要 ヒストグラムの各棒の高さを表す整数配列が与えられたとします。各棒の幅はすべて1です。このとき、ヒストグラムの中に含まれる長方形のうち、面積が最大となるものを見つけるのがこの問題です。 解法のアプローチ:スタックを活用する この問題はスタックを使うことで効率的に解けます。各棒について「その棒の高さを上限とした長方形」が左右にどこまで広げられるかを、インデックスをスタックで管理しながら求めていくのがポイントです。 アルゴリズムの手順 空のスタックを作成し、i := 0、ans := 0 で初期化します。 i が heights のサイズ未満である間、以下を繰り返します。 スタック