我想请问这道“反转字符串中的元音字母”,以下代码为什么总返回原单词而不是反转后的单词?
class Solution:
def reverseVowels(self, s: str) -> str:
s = [s]
i = 0
j = len(s)-1
vowels = {'a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U'}
while i < j:
if s[i] in vowels and s[j] in vowels:
s[i], s[j] = s[j], s[i]
i += 1
j -= 1
if s[i] not in vowels:
i += 1
if s[j] not in vowels:
j -= 1
return ''.join(s)
你第三行代码s = [s]
等价于s = [s, ]。也就是说,如果入例值为"1a2e3i4o5u",则s = ["1a2e3i4o5u", ],所以j的值为0,你的while i < j:永远走不进去。
把第三行代码改为s = list(s)
就可以了
class Solution:
def reverseVowels(self, s: str) -> str:
i = 0
j = len(s)-1
s = list(map(str, s)) #这里!!!
vowels = {'a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U'}
while i < j:
if s[i] in vowels and s[j] in vowels:
s[i], s[j] = s[j], s[i]
i += 1
j -= 1
if s[i] not in vowels:
i += 1
if s[j] not in vowels:
j -= 1
return ''.join(s)
s = Solution()
print(s.reverseVowels("wawbe"))
问题点: 反转字符串中的元音字母不生效
分析思路: 第三行代码, 变量s转换成列表的方式错误
修改代码为:
s = list(s)
print(s) # ['w', 'a', 'w', 'b', 'e']
不知道你这个问题是否已经解决, 如果还没有解决的话:问题的原因在于代码中将字符串 s 包裹在一个列表中,导致在循环中对 s 进行修改时出现了错误。另外,代码中没有考虑到字符串为空的情况。
以下是修复问题的代码:
class Solution:
def reverseVowels(self, s: str) -> str:
if not s:
return s
s_list = list(s)
i = 0
j = len(s_list) - 1
vowels = {'a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U'}
while i < j:
if s_list[i] in vowels and s_list[j] in vowels:
s_list[i], s_list[j] = s_list[j], s_list[i]
i += 1
j -= 1
elif s_list[i] not in vowels:
i += 1
elif s_list[j] not in vowels:
j -= 1
return ''.join(s_list)
修复后的代码首先判断字符串是否为空,若为空则直接返回原字符串。然后将字符串转换为列表,再进行反转元音字母的操作。修复后的代码不再将字符串包裹在列表中,而是创建一个字符列表,并对该字符列表进行修改。同时,在判断元音字母时,使用的是 s_list[i] 和 s_list[j],而不是 s[i] 和 s[j]。
修复后的代码可以准确地反转字符串中的元音字母。