345.反转字符串中的元音字母
题目:编写一个函数,以字符串作为输入,反转该字符串中的元音字母。
示例:
输入:‘hello’
输出:‘holle'
初始我自己的代码
class Solution:
def reverseVowels(self, s: str) -> str:
# assert type(s)==str
start,end=0,len(s)-1
s=list(s)
target_list= ['a','e','i','o','u']
while start<end:
if s[start] not in target_list:
start+=1
elif s[end] not in target_list:
end-=1
else:
mid=s[start]
s[start]=s[end]
s[end]=mid
return ''.join(str(s))
我当时一开始写成这样的思路是,我想它要找出字符串里的元音字母,那么我首先要定义元音字母的元素列表,然后让指针指向的字符到元素列表里找是否符合元音的规则,然后借助中间变量进行前后位置调换;如果start位置的字符不是元音则往后找;如果end位置的字符不是元音往前找,最后再将列表转回字符串输出;
但是这里代码存在几大问题:
- 在互换位置的条件,也就是else那里会由于有几个条件没考虑,导致整个程序陷入了死循环
即如果start在target list里,end也在target list里的时候,是除了进行互换之外,还需要加入指针移动语句使得程序挑出这个判断语句,继续回到while循环才行,不然就会一直在不停地互换,因为这里又没有返回值,程序是无法结束的。 - 漏掉了几个判断情况:
元音字母需要把大写也考虑进去;转列表那里我也写错了,不应把str外加在s上
当然官方给出的判断思路是
首先 start 和 end同时在元音list里面,互换,并移动指针即start+=1;end-=1
其次 start 在元音list里面,end-=1
还有 end 在元音list里面,start+=1
其余情况,start+=1;end-=1
我感觉应该是官方给的比较全面一点吧从思路上哈哈
然后正确的代码是:
class Solution:
def reverseVowels(self,s:str)->str:
if len(s)<1:
return s
s=list(s)
start,end=0,len(s)-1
vowels=set('aeiouAEIOW')
while start<end:
if s[start] in vowels and s[end] in vowels:
s[start],s[end]=s[end],s[start]
start+=1
end-=1
elif s[start] in vowels:
end-=1
elif s[end] in vowels:
start+=1
else:
start+=1
end-=1
return ''.join(s)
测试用例
def reverseVowels(s):
if len(s)<1:
return s
s=list(s)
start,end=0,len(s)-1
vowels=set('aeiouAEIOU')
while start<end:
if s[start] in vowels and s[end] in vowels:
s[start],s[end]=s[end],s[start]
start+=1
end-=1
elif s[start] in vowels:
end-=1
elif s[end] in vowels:
start+=1
else:
start+=1
end-=1
return ''.join(s)
print(reverseVowels('hello'))
然后我把我的思路改正后的代码提交了
class Solution:
def reverseVowels(self, s: str) -> str:
if len(s)<1:
return s
s=list(s)
start,end=0,len(s)-1
target_list=list('aeiouAEIOU')
while start<end:
if s[start] not in target_list:
start+=1
elif s[end] not in target_list:
end-=1
else:
s[start],s[end]=s[end],s[start]
start+=1
end-=1
return ''.join(s)
提交结果发现竟然比官方的思路要快一点,如图,第二个是我的
说明我判断的思路应该没有大问题,不过官方的结题思路更严谨,值得学习。