面试问题:反转字符串,但仅反转字母字符。整数应保持其原始位置。
输入:“abc12de”
输出:“edc12ba”
输入:“abcde79”
输出:“edcba79”
输入:“123ab456”
输出:“123ba456”
下面是我的半工作代码。
def reverse_string(string):
acc = ""
l = []
l.extend(string)
for char in l:
if char >= 0 and char <= 9:
pass
else:
acc = char + acc
return acc
print(reverse_string("abc12de"))
一种策略可能是从两端遍历指针,跳过数字。当找到两个非数字时,交换。当指针相遇时停止。您只需要注意当字符串全部是数字/字母时可能出现的边缘情况:
def rev(st):
s = list(st)
i = 0
j = len(s)-1
while i < j:
while (i < len(s) and s[i].isdigit() ):
i += 1
while (j >=0 and s[j]. isdigit()):
j -= 1
if i < j:
s[j], s[i] = s[i], s[j]
i += 1
j -= 1
return ''.join(s)
print(rev('123ab456'))
print(rev('abc12de'))
print(rev('abcde79'))
print(rev('1234'))
print(rev('abcd'))
result
123ba456
edc12ba
edcba79
1234
DCBA
另一种(可能)效率较低但更易于阅读的替代方案是按相反顺序生成所有字母的生成器,然后逐步遍历字符串next()
来自字母生成器的字母或当前字符(如果它是数字):
def rev(string):
reversed_letters = (s for s in string[::-1] if s.isalpha())
news = ''
for s in string:
if s.isalpha():
news+= next(reversed_letters)
else:
news += s
return news
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)