Pythonで最大の数を作る方法:cmp_to_keyを使ったカスタムソートの実装
負でない整数のリストが与えられたとき、それらをうまく並べ替えて、可能な限り大きな数を作ることを考えます。例えば、配列が [10, 2] の場合、最大の数は「210」となります。
解き方のアプローチ
この問題を解くには、以下の手順に従います。
- まず、すべての整数を文字列に変換します。
- 2つの数値 x と y を比較する際は、単純な大小比較ではなく、「x を先に置いた場合(x+y)」と「y を先に置いた場合(y+x)」の連結結果を比べます。より大きい数になる順序でソートすることで、最も桁の並びが有利な配置になります。
- ソートが完了したら、すべての数値を連結して結果の文字列を返します。
実装例
以下は、Pythonの functools.cmp_to_key を利用してカスタム比較関数でソートを行う実装例です。lstrip("0") or "0" の部分は、[0, 0] のようにすべてがゼロの場合に「00」ではなく「0」を返すための工夫です。
from functools import cmp_to_key
class Solution(object):
def largestNumber(self, nums):
for i in range(len(nums)):
nums[i] = str(nums[i])
nums.sort(key=cmp_to_key(lambda x,y:self.compare(x,y)))
return "".join(nums).lstrip("0") or "0"
def compare(self,x,y):
if x+y<y+x:
return 1
elif x+y == y+x:
return 0
else:
return -1
ob1 = Solution()
print(ob1.largestNumber([3,30,5,6,8]))
入力
[3,30,5,6,8]
出力
"865330"
ポイントの解説
このアルゴリズムの鍵となるのは、compare 関数です。例えば「3」と「30」を比較する場合、「330」と「303」を比べると「330」の方が大きいため、3が30より先に来るべきだと判断できます。このように連結結果そのものを比較基準にすることで、どのような組み合わせでも正しく最大の数が得られます。計算量はソートに依存し、O(n log n) となります。
-
Pythonでリスト内の最大値を見つける方法をわかりやすく解説
この記事では、Pythonを使ってリストの中から最大の要素(最大値)を見つける方法について解説します。初心者の方でも理解しやすいよう、複数のアプローチをコード例とともに紹介していきます。 問題の概要 問題文: 与えられたリストの中から、最も大きい要素を求めて出力してください。 Pythonには便利な組み込み関数が用意されているため、これらを活用することで短いコードで効率的に問題を解決できます。ここでは主に sort() メソッドと max() 関数の2つの方法を取り上げます。 方法1:sort() 関数を使う sort() メソッドはリストを昇順に並べ替えます。並べ替え後のリストの末尾(インデ
-
Pythonでリスト内の最大値を見つける方法|sort()とmax()の2つのアプローチ
この記事では、リストの中から最大の数値を見つけるための解決策とアプローチについて詳しく解説します。問題の概要数値のリストが与えられたとき、その中から最大の要素を見つけ出す必要があります。Pythonでは、主に以下の2つの方法でこれを実現できます。ソート(並べ替え)を利用する方法組み込み関数 max() を利用する方法アプローチ1:sort() 関数を使う方法リストを sort() メソッドで昇順に並べ替えると、リストの最後の要素(インデックス -1)が必ず最大値になります。サンプルコードlist1 = [18, 65, 78, 89, 90] list1.sort() # メイン処理 prin