我正在尝试编写一个算法,按照频率和字母顺序重新排列字符串中的字母。例如,“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)
有关如何最有效地实施此算法的任何建议吗?
答案 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函数来进行稳定排序,如果你不想自己实现它。