整数降順で配列[アルゴリズム]



※この写真と投稿内容の問題は、ProgrammersのWebサイトから抜粋しています.

に質問

함수 solution은 정수 n을 매개변수로 입력받습니다. 
n의 각 자릿수를 큰것부터 작은 순으로 정렬한 새로운 정수를 리턴해주세요. 
예를들어 n이 118372면 873211을 리턴하면 됩니다.

제한 조건 : n은 1이상 8000000000 이하인 자연수입니다.

<입출력 >
n	| return
118372	| 873211

ほどく


My Code

def solution(n):
    str_n = list(str(n))
    sort_n = sorted(str_n, reverse=True)
    answer = int(''.join(sort_n))
    return answer
このアルゴリズムは、段階的および順序的な計算によって展開されません.
Python内蔵関数sorted()関数を使用しました.str()入力値を関数で文字列に変換します.list()関数によりstr nという変数には、入力した数字の各桁数が文字列で構成されたリストが含まれます.
私たちは上の過程で数字を1つずつ分けます.
数値が文字列になってもintデータと同じサイズ関係になります.sorted()という名前の関数でソートし、reverse=Trueという名前のパラメータ値を入力します.
降順で返す.
その後、''.join(sort_n)で並べ替えられた数字を集計した.
コマンドは、スペース''.join([List])です.

説明する


(1)
def merge(left, right):
    result = []
    while len(left) > 0 or len(right) > 0:
        if len(left) > 0 and len(right) > 0:
            if left[0] >= right[0]:
                result.append(left[0])
                left = left[1:]
            else:
                result.append(right[0])
                right = right[1:]
        elif len(left) > 0:
            result.append(left[0])
            left = left[1:]
        elif len(right) > 0:
            result.append(right[0])
            right = right[1:]
    return result

def mergeSort(arr):
    if len(arr) <= 1:
        return arr

    mid = len(arr) // 2
    left = arr[:mid]
    right = arr[mid:]

    left = mergeSort(left)
    right = mergeSort(right)

    return merge(left, right)

def solution(n):
    arr = list(str(n))
    n = int(''.join(mergeSort(arr)))
    return n
長いですが、このような過程で分析するのはかっこいいようです.
この誠実さと根性は本当に素晴らしいと思います.
まず、構成を見てみましょう.3つの関数を定義して、順番に見てみましょう.
先頭に立つmerge(left, right)関数;
resultは「空のリスト」を宣言します.while len(left) > 0 or len(right) > 0 :len()関数に設定されます.
リストや文字列などの変数を受信し、入力した2つの値のうち1つの値の長さを0とするループ文が設定されています.
その後3つの条件を書きました.
  • if len(left) > 0 and len(right) > 0 :(両方の値の長さが0より大きい場合)
  • 内部条件文
    -if left[0] >= right[0] :(左の最初の値が右の最初の値より大きいか等しい場合)
    :結果リストにleft値を追加し、leftを最初の値の後の値を含むリストとして再宣言します.else上記の手順をrightに変換して、同じ操作を実行します.
  • elif len(left) > 0 :(左の値が0より大きい場合のみ)->1番の内部条件文の"if式"
  • elif len(right) > 0 :(右が0より大きい場合のみ)->1番内部条件文の「else式」
  • 2、3番条件文の実行コマンドは、1番条件文ごとの内部条件文の実行コマンドと同じです.
    2番目の関数はmergeSort(arr).
    変数名から行列データを直感的に得ることができる.
    (最後のsolution関数の式を参照してください.低arrに入力された数値list(str())で文字列リストになります.)😁)
    最初の条件式はif len(arr) <= 1 : return arrで、1桁の場合にすぐに返されるコマンドです.
    適用されない場合
    優先順位
    midという変数では、(입력된 값의 자릿수) // 2で中央位置の数字のインデックス値を指定します.
    次にleftとrightという変数に中心で区切られたリストを追加し、
    実行関数自体の再帰式を記述した.完了return merge(left, right)このようにして最初の条件式まで繰り返します.
    先に宣言したmerge(left,right)に戻る各ステップのみがソートされ、実行関数として繰り返されるmerge()がマージソートされ、最後に完了した降順ソートリストが得られる.
    最後は3番目の関数で、柵のような大きなフレーム関数でもあります.solution関数を使用して入力値を文字列リストに設定
    上記の手順を実行して、インポートした降順ソートリストをint(''.join(mergeSort(arr)))に再結合し、整数値に変換して返します.
    (2)
    def solution(n):
        ls = list(str(n))
        ls.sort(reverse = True)
        return int("".join(ls))
    これは、私が使用している独立した関数sorted()ではなく、リスト継承関数.sort()関数を使用するプールです.逆方向に配置するreverse=Trueは、リスト要素をマージする"".join()と同じです.
    プロセスが短縮され、より清潔な姿が印象的でした.