反向字符串功能上增加了额外的空间

时间:2019-06-14 15:52:12

标签: python

我试图弄清楚如何使用Python而不使用[::-1]解决方案来反转字符串。

我的代码似乎可以在多个测试用例中正常工作,但是它为一个实例增加了一个额外的空间,我不知道为什么。

def reverse(s):
    r = list(s)
    start, end = 0, len(s) - 1
    x = end//2
    for i in range(x):
        r[start], r[end] = r[end], r[start]
        start += 1
        end -= 1

    print(''.join(r))


reverse('A man, a plan, a canal: Panama')

# returns 'amanaP :lanac  a,nalp a ,nam A'
# note the double space ^^ - don't know why


reverse('a monkey named fred, had a banana')

# 'returns ananab a dah ,derf deman yeknom a'


reverse('Able was I ere I saw Elba')

# returns 'ablE was I ere I saw elbA'

4 个答案:

答案 0 :(得分:3)

更改

    x = end//2

    x = len(s)//2

答案 1 :(得分:1)

该错误似乎与偶数长度字符串的处理有关。构建字符串反向函数的一种简单得多的方法是:

def reverse(s):
    result = ""
    for character in reversed(s):  #Reversed returns an object that, when used in a for loop, outputs each object of a string, list, or other iterable, in reverse order.
        result += character #Add that character back to the result.
    return result

此功能不管字符串长度如何都起作用。我希望这会有所帮助。

答案 2 :(得分:1)

使用您正在使用的技术,可以更清楚地直接测试start end,而不是尝试管理长度和索引。您可以使用while start < end:来做到这一点。例如:

def reverse(s):
    r = list(s)
    start, end = 0, len(s) - 1
    while start < end:
        r[start], r[end] = r[end], r[start]
        start += 1
        end -= 1

    print(''.join(r))

reverse('A man, a plan, a canal: Panama')

打印

amanaP :lanac a ,nalp a ,nam A

答案 3 :(得分:0)

您的bug处于边界条件下,长度相等:

start, end = 0, len(s) - 1
x = end//2
for i in range(x):

例如,您的for迭代器有8个字符,是(range(3)),它仅使您获得前三个位置。

您无法交换中间对。

解决此问题的“干净”方法是更改​​您的x计算:

x = (end+1) // 2

或者,正如其他人所说的

x = len(s) // 2