我试图弄清楚如何使用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'
答案 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