プログラマの最大数


大数

私のやり方


strに変換された大きな数から並べ替え、strを返します.間違っています~
入力が[3, 30, 34, 5, 9]と同じである場合、大数から並べ替えると[9, 5, 34, 30, 3]であり、9534303であり、これは最低価格ではないからである.

解き直す時。

[3, 34, 30]の中で30より前に現れるべき数字が3であることを知るために、3回繰り返すことができます.3回繰り返すのはnumbersの要素が0以上1000以下であるためです.10000以下の数字であれば、4回繰り返すことができます.[3, 34, 30][333, 343434, 303030][343434, 333, 303030][34, 3, 30]入力した数字の重複を考慮してdictのvalueをlistに設定してソートし,これより短いコードがある.
from typing import OrderedDict


def solution(numbers):
    big_number = ""
    repeated_str_numbers = dict()

    for num in numbers:
        num = str(num)
        if num not in repeated_str_numbers.keys():
            repeated_str_numbers[num] = [str(num)*3]
        else:
            repeated_str_numbers[num].append(str(num)*3)

    repeated_str_numbers = OrderedDict(
        sorted(repeated_str_numbers.items(), key=lambda item: item[1], reverse=True))

    for num, str_num in repeated_str_numbers.items():
        for _ in range(len(str_num)):
            big_number += num

    if set(big_number) == {'0'}:
        return "0"

    return big_number

より簡潔なコード

  • str
  • に変換
  • 長さに3倍を乗じ、大数から
  • を並べ替える.
  • joinをstrに変換し、intを加えると0000→0、1234→1234
  • となる.
    def solution(numbers):
        numbers = list(map(str, numbers))
        numbers = sorted(numbers, key=lambda item: item*3, reverse=True)
        return str(int(''.join(numbers)))