Сортировать символы по частоте

Вход: "дерево"

Выход: "eert"

Объяснение: «e» появляется дважды, а «r» и «t» - один раз. Таким образом, "e" должно стоять перед "r" и "t". Следовательно, "eetr" тоже правильный ответ.

Я пробовал примерно так:

class Solution(object):
def frequencySort(self, s):
    """
    :type s: str
    :rtype: str
    """
    has = dict()
    l = list()
    for c in s:
        if c not in has:
            has[c] = 1
        else:
            has[c] += 1
    for k in sorted(has,key = has.get, reverse = True):
        for i in range(has[k]):
            l.extend(k)
    return ("".join(l))

но его O (n * m) n = длина строки, m = максимальное вхождение символа

Как я могу улучшить это до порядка n?

может быть return ''.join(c * t for c, t in collections.Counter(s).most_common())bookshadow.com/weblog/2016/11/02/…

davedwards 07.08.2018 00:24
sorted(s, key=Counter(s).get, reverse=True) тоже работает.
davedwards 07.08.2018 00:27
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
2
848
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Есть ли причина, по которой вы не можете использовать встроенную сортировку с лямбда-ключом?

>>> a = 'aabbbcccccd'
>>> sorted(a, key=lambda c: a.count(c))
['d', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'c', 'c', 'c']
>>> sorted(a, key=lambda c: a.count(c), reverse=True)
['c', 'c', 'c', 'c', 'c', 'b', 'b', 'b', 'a', 'a', 'd']
>>> ''.join(sorted(a, key=lambda c: a.count(c), reverse=True))
'cccccbbbaad'

Я считаю, что методы сортировки python - это O(n log n), но count сделает этот O(n^2)

Я думаю, что это О (п ^ 2), поскольку count должен пройти весь список для каждого символа.

Prune 07.08.2018 00:27

@EastonBornemeier Вы забываете о звонках a.count(c).

poke 07.08.2018 00:29

Вы правы @Prune. Есть ли способ сделать это быстрее?

Easton Bornemeier 07.08.2018 00:29

Другие вопросы по теме