我该如何按频率顺序订购信件?

时间:2012-10-18 03:50:19

标签: algorithm

我正在尝试编写一个算法,按照频率和字母顺序重新排列字符串中的字母。例如,“apple”变成“aelpp”。 “香蕉”变成“bnnaaa”。

我知道各种语言,但我现在使用Python来编写代码。这是我到目前为止所做的,但它不起作用,因为没有频率排序。

def order(word):
  word = word.lower()
  storage = [0] * 26
  for c in word:
    storage[ord(c) - 97] += 1
  newWord = []
  for l, c in enumerate(storage):
    for i in range(0, storage[l]):
      newWord.append(chr(l + 97))
  return ''.join(newWord)

有关如何最有效地实施此算法的任何建议吗?

2 个答案:

答案 0 :(得分:2)

这是一个(主要)pythonic示例,说明如何在python中处理这个问题, 我希望这些评论足以解释正在发生的事情:

words = ["apples", "banannas", "oranges"]

def main():
    # our list of jumbled words
    jumbled = []
    for word in words:
        # dictionary of letter / frequency pairs.
        letters = {};
        # get letter frequency
        for letter in word:
            if letter in letters:
                letters[letter] += 1
            else:
                letters[letter] = 1
        # sort the letter / frequency pairs on descending frequency
        jumbled_word = sorted(letters.items(), key = lambda x: x[1],
                                                              reverse = True)
        # join the letters back together and add to our jumbled words
        jumbled.append(''.join([x[0] for x in jumbled_word]))
        letters = {}

    # print out the jumbled words in alphabetical order
    for x in sorted(jumbled):
        print x

if __name__=="__main__":
    main()

这种实施将保留大写字母资本。

答案 1 :(得分:1)

对于频率,常用的工具是哈希表(python中的字典)。我对python并不十分自信所以我会给你一些伪代码

hashtable table
for character in string
  table[character] +=1;
list partiallySorted = alphabetize(table.keys()) 
list sortedList = stablesort partiallySorted by (table[a]<table[b] iff a<b)

稳定排序将维持相等元素之间的相对顺序,从而保留您的订单。

幸运的是,因为python 2.2所有种类都保证稳定所以你可以调用库的sort函数来进行稳定排序,如果你不想自己实现它。