算法--双指针2

目录

前言

解题

分析


前言

OK啊,各位,我又来给你们分享我的算法了,今天依旧是双指针算法。这一章是关于字符串的处理的双指针。下面是题目

345. 反转字符串中的元音字母 - 力扣(LeetCode)


解题

如果想直接编写的,可以直接在自己的编译器中编程序了,题目我放这里了。然后说一下我框的这几个。首先,我看的是有点懵的。仔细想一想,他的意思就是说,我们要找出一个字符串中的元音字母,然后翻转就好了。

那么 好,我们应该怎么实现呢?我可以像上次一样,定义两个变量,然后去找有那些元音字母

python 复制代码
left = 0
right = len(s) - 1
while left <= right:

OK,那下面我们应该怎么写呢?因为我们主要针对的就是元音字母对不对,所以我的left和right指针应该指向的是元音字符,所以我们要移动他们到对应的位置。

python 复制代码
left = 0
right = len(s) - 1
while left <= right:
    if s[left] not in 'aeiouAEIOU':
        left += 1
        continue
    if s[right] not in 'aeiouAEIOU':
        right -= 1
        continue

是吧,这样我们就可以交换了,但是我们发现这个是字符串我们是无法直接交换的,因为他是不可变变量,所以我们可以把它转成list。即s = list(s)。这样我们就可以直接交换了。

OK,下面展示完整的代码

python 复制代码
class Solution:
    def reverseVowels(self, s: str) -> str:
        word = list(s)
        left = 0
        right = len(s) - 1
        while left <= right:
            if word[left] not in 'aeiouAEIOU':
                left += 1
                continue
            if word[right] not in 'aeiouAEIOU':
                right -= 1
                continue
            word[left], word[right] = word[right], word[left]
            left += 1
            right -= 1
        return ''.join(word)
            
            

那么OK,这个题目我们就解决了,我们真是太棒了。

分析

来说一下问题哈,首先为什么要使用到双指针,使用别的方法不行吗?答案是,双指针不是唯一答案但是他是最优的答案。你们如果想的话,是可以这样的,就额外开空间,找出所有元音字母的位置,并要把值给带出来,建议使用字典,然后创建一个ans数组,先填充不变的字母,如果遇到事元音字母的位置你就去你创建的字典哪里查找,并填入位置为最后面的元音字母,就是倒着填入

有点麻烦,所以我没有写,如果想锻炼自己的编程,可以去试一下

然后就是这里,为什么我中间要使用if和continue,而不是直接使用while。使用while不是更快更简洁吗?嗯,没错,可以使用到while,但是如果要使用到while的话,就要考虑到更多的因数了,不太建议新手去使用,但是我建议新手去学习。

为什么这么说,首先,你的while语句,很明确的说明了,你的left或者right指针要指向对应的值,那我问你,如果你直接使用while而不去考虑边界的话,会出现什么情况?会出现left>right。那么这里就已经违反了题目了。而且如果你不设置它的left和right的区域的话,还会执行出错

python 复制代码
class Solution:
    def reverseVowels(self, s: str) -> str:
        word = list(s)
        left = 0
        right = len(s) - 1
        while left <= right:
            while left < len(s) and word[left] not in 'aeiouAEIOU':
                left += 1    
            while right > 0 and word[right] not in 'aeiouAEIOU':
                right -= 1
            if left <= right:
                word[left], word[right] = word[right], word[left]
                left += 1
                right -= 1
            else:
                break
        return ''.join(word)

那,这个就是while的写法,所以有有点麻烦,但是新手确实应该去掌握。最后的if-else呢就是一个剪枝,因为left>right的话就已经不合法了。(没有上面执行效率高)但也值得学习。有不懂的可以问,谢谢大家观看^v^

相关推荐
变量未定义~39 分钟前
最小生成树1(Prim模板)、最小生成树2(kruskal模板)、最近公共祖先(模板)
算法
这就是佬们吗42 分钟前
Python入门⑤-异常处理、文件操作与实战项目
开发语言·数据库·python·算法·pycharm
LONGZETECH1 小时前
新能源汽车充电设备装配与调试仿真教学软件 技术架构与核心实现解析
大数据·算法·3d·unity·架构·汽车
自学小白菜1 小时前
关于提升机器学习算法做预测回归任务精度的方法分享
算法·机器学习·回归·提升精度
学废了wuwu1 小时前
从入门到实战:深入浅出模型压缩三大核心——剪枝、彩票假设与知识蒸馏
人工智能·算法·剪枝
小肝一下1 小时前
3. 单链表
c语言·数据结构·c++·算法·leetcode·链表·dijkstra
劈星斩月1 小时前
监督学习算法 之 决策树
学习·算法·决策树
学计算机的计算基1 小时前
操作系统内存管理全解:虚拟内存、页表、COW、malloc、OOM一篇搞定
java·笔记·算法
tachibana21 小时前
hot100 前 K 个高频元素(347)
java·数据结构·算法·leetcode
陈天伟教授2 小时前
暴力美学-大型语言模型与涌现:一个复杂系统视角
人工智能·算法