leedcode-指针篇(3)

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位置的字符不是元音往前找,最后再将列表转回字符串输出;
但是这里代码存在几大问题:

  1. 在互换位置的条件,也就是else那里会由于有几个条件没考虑,导致整个程序陷入了死循环
    即如果start在target list里,end也在target list里的时候,是除了进行互换之外,还需要加入指针移动语句使得程序挑出这个判断语句,继续回到while循环才行,不然就会一直在不停地互换,因为这里又没有返回值,程序是无法结束的。
  2. 漏掉了几个判断情况:
    元音字母需要把大写也考虑进去;转列表那里我也写错了,不应把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)

提交结果发现竟然比官方的思路要快一点,如图,第二个是我的
leedcode-指针篇(3)_第1张图片
说明我判断的思路应该没有大问题,不过官方的结题思路更严谨,值得学习。

你可能感兴趣的:(leedcode刷题,leetcode)