【问题标题】:Sort characters by frequency [duplicate]按频率对字符进行排序[重复]
【发布时间】:2018-08-06 22:22:21
【问题描述】:

输入: “树”

输出: “特别”

说明: '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 级?

【问题讨论】:

标签: python algorithm


【解决方案1】:

您是否有不能使用带有 lambda 键的内置排序的原因?

>>> 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)

【讨论】:

  • 我认为这是 O(n^2),因为 count 必须遍历每个字符的整个列表。
  • @EastonBornmeier 你忘记了a.count(c) 那里的电话。
  • 你是对的@Prune。有没有办法可以更快?
猜你喜欢
  • 2020-02-06
  • 1970-01-01
  • 2020-06-13
  • 2021-02-21
  • 2021-01-20
  • 2014-01-10
  • 2021-11-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多