创建一个函数,该函数 returns 给定的字符串按降序(不反转)顺序排列

Create a function that returns a given string in descending(NOT REVERSE) order

我在期末考试时遇到了这个问题,但我想不通。我最初尝试使用 for i in range(len(string)-1) 循环来比较索引中字符的数值。

我知道我可以只使用列表对列表进行排序然后反向打印,但我们被告知我们不能使用列表或反向和排序功能。

也不能使用 print(string[ : :-1]) 技术,因为这不是反转字符串,而是将其降序排列。例如,字符串 "Hello" 将输出 "ollhe" 而不是 "olleh" 而字符串 "world" 将输出 "wrold" 而不是 "dlrow"

如果有人能帮助我,我将不胜感激。

尝试使用以下几个字符串作为 st

def finalexamquestion(st):
    st = st.lower()
    max = 'a'
    result = ""
    for j in range(len(st)):
        for i in range(len(st)):
            if st[i] >= max:
                max = st[i]
                idx = i
        st = st[:idx]+st[idx+1:]
        result += max
        max = 'a'
#    print result
    return result

使用字符的 ASCII 值查找字符串中的最大值(后面是字母表)。这基本上是一个处理字符串和排序字符的排序函数。您可以实现更好的排序算法,例如 QuickSort(我的实现使用 O(n^2))。 O(nlogn) 有更好的算法,但这不是重点,所以我用那个实现它。

对于字符串中的每个字符,找到最大值并将其从字符串中删除。

尚不清楚该函数是否应该仅适用于字母表字母或标点符号(以及 space),因此我假设仅适用于字母表中的 26 个字母。然而,对此的扩展很简单。

def descent_alphabetically(word):
    # Lazy way of constructing 'zyxw...dcba'
    alphabet = ''.join(chr(i) for i in xrange(122, 96, -1))
    word = word.lower()
    return ''.join(letter * word.count(letter) for letter in alphabet)

这个想法是你以相反的顺序浏览字母表中的字母,然后数一数你的单词中有多少个。如果计数为 0,则字符串乘法将为空,而例如,如果字母 'a' 为三,则会得到 'aaa'.

你说列表是允许的。我不知道这是否也会扩展到 range(),因为它会生成一个列表。但是您始终可以按照希望它们出现的相反顺序对字母表的 "symbols" 进行硬编码。由于不允许使用列表,这是否也意味着 list/generator 推导式也不允许?您可以通过将语法更改为:

来避免这种情况
result = ''
for letter in alphabet:
    result += letter * word.count(letter)

例子

descent_alphabetically('Hello')
'ollhe'
>>> descent_alphabetically('world')
'wrold'
>>> descent_alphabetically('alphabet')
'tplhebaa'