少见的更优写法,反转字符串中的元音字母

news2024/12/23 12:28:56

在这里插入图片描述
Leetcode 原题链接

解法一

这道题很简单,令双指针 l l l r r r 从两侧相向移动,交换元音字母即可。但大多人的实现是如下这种可简化的嵌套循环。

Screenshot 2024-06-24 at 6.37.23 PM.png
如果是 Java 等 String 不可变的语言,应先转换为 CharArray,交换完元音字母后改回 String 形式。

此处仅提供 Java 代码,多语言代码块可以看这里。

class Solution {
    public String reverseVowels(String s) {
        int l = 0; // 左指针
        int r = s.length() - 1; // 右指针
        // 将字符串 s 改成数组,方便交换字符
        char[] chars = s.toCharArray();
        // 所有元音字母,hash set 形式
        Set<Character> vowels = new HashSet<>(Arrays.asList('a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U'));

        while (l < r) {
            // 从左向右找元音字母
            while (l < s.length() && !vowels.contains(chars[l])) 
                l++;
            // 从右向左找元音字母
            while (r >= 0 && !vowels.contains(chars[r])) 
                r--;

            // 双指针相遇,退出
            if (l >= r) break;

            // 交换
            char temp = chars[l];
            chars[l++] = chars[r];
            chars[r--] = temp;
        }

        return new String(chars);
    }
}

解法二

我们可以在一个循环中直接实现。

class Solution {
    public String reverseVowels(String s) {
        int l = 0;
        int r = s.length() - 1;
        char[] chars = s.toCharArray();
        Set<Character> vowels = new HashSet<>(Arrays.asList('a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U'));

        while (l < r) {
            if (!vowels.contains(chars[l])) {
                l++;
            } else if (!vowels.contains(chars[r])) {
                r--;
            } else {
                char temp = chars[l];
                chars[l] = chars[r];
                chars[r] = temp;
                l++;
                r--;
            }
        }
 
        return new String(chars);
    }
}

这种简化循环的技巧在实际开发中也能用到,只是稍慢于传统的嵌套 while 循环。

读者在初次接触时可能不太习惯,但一回生,二回熟。

复杂度

时间: Θ ( n ) \Theta(n) Θ(n)
空间:

  • 在 C++ 等 String 可变的语言中为 Θ ( 1 ) \Theta(1) Θ(1)
  • 在其他语言中因为构建了数组,为 Θ ( n ) \Theta(n) Θ(n)

推广

以下均为个人所著,兼顾了面试、本科、硕士阶段,包含清晰的 PPT 动画展示以及配套的练习题。读者也在陆续写其他算法教程。

  • 附个人题解的双指针题单

  • 图论入门

  • 图论进阶

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1888346.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ubuntu运行qq音乐闪退

ubuntu运行qq音乐闪退 修改/usr/share/applications中的qqmusic.desktop&#xff0c;在Exec后加上 --no-sandbox,如下图所示&#xff1a; 该文件有可能是只读&#xff0c;权限不够的话用sudo vim qqmusic.desktop

Ollama报错:Error: llama runner process has terminated: exit status 0xc0000409

0&#xff0c;背景 今天听说谷歌家的Gemma2性能很好&#xff0c;于是在Ollama上下载到本地测试一下 ollama run gemma2 结果终端里报错 Error: llama runner process has terminated: exit status 0xc0000409 1&#xff0c;原因 原因很简单&#xff0c;新的模型&#xff…

【Linux】应用层创建XXX文件,文件系统调用可以查看到文件名

搞了台电脑&#xff0c;昨天把系统装了下&#xff0c;继续搞事&#xff1a; 上次基于内核代码openat的系统打印被操作的文件名&#xff0c;发现不成功&#xff0c;很奇怪&#xff0c;这种问题内核不可能会犯这种低级别的问题吧&#xff1f; 反过来想&#xff0c;那不是内核的问…

40V转5V,40V转3.3V,40V转3V使用什么降压芯片型号?

40V转5V,40V转3.3V,40V转3V使用什么降压芯片型号? # 40V转5V、3.3V、3V降压芯片&#xff1a;AH8820A的介绍与应用 在电子电路设计中&#xff0c;电压转换是一个常见的需求。特别是在需要将较高电压转换为较低电压以供微控制器、传感器和其他低电压设备使用时&#xff0c;降压…

AI一键音频转文字工具 速度超快,支持实时转换,无需联网,本地整合包下载

这是 CapsWriter-Offline &#xff0c;一个 PC 端的语音输入、字幕转录工具。可用实现简单一键将音频文件转换成文字的懒人工具。 两个功能&#xff1a; 1、实时转换&#xff0c;按下键盘上的 大写锁定键&#xff0c;录音开始&#xff0c;当松开 大写锁定键 时&#xff0c;就会…

泰勒展开式在Android系统或应用程序中的应用

泰勒展开式在Android系统或应用程序中的应用 引言 泰勒展开式(Taylor Series)是高等数学中的一个重要工具,它允许我们将一个复杂函数表示为一个无穷多项式的和,从而近似计算函数值。在Android开发中,理解和应用泰勒展开式有助于优化涉及复杂数值计算的算法,提高应用程序…

【问题已解决】Vue管理后台,点击登录按钮,会发起两次网络请求(竟然是vscode Compile Hero编译插件导致的)

问题 VueElement UI 做的管理后台&#xff0c;点击登录按钮&#xff0c;发现 接口会连续掉两次&#xff0c;发起两次网络请求&#xff0c;但其他接口都是正常调用的&#xff0c;没有这个问题&#xff0c;并且登录按钮也加了loading&#xff0c;防止重复点击&#xff0c;于是开…

Ai绘画:床上的小萝莉

AIGC技术的未来发展前景广阔&#xff0c;随着人工智能技术的不断发展&#xff0c;AIGC技术也将不断提高。未来&#xff0c;AIGC技术将在游戏和计算领域得到更广泛的应用&#xff0c;使游戏和计算系统具有更高效、更智能、更灵活的特性。同时&#xff0c;AIGC技术也将与人工智能…

黑马点评DAY1|Redis入门、Redis安装

什么是Redis&#xff1f; redis是一种键值型数据库&#xff0c;内部所存的数据都是键值对的形式&#xff0c;例如&#xff0c;我们可以把一个用户数据存储为如下格式&#xff1a; 键值id$1600name张三age21 但是这样的存储方式&#xff0c;数据会显得非常松散&#xff0c;因…

C# 计算椭圆上任意一点坐标

已知圆心坐标 &#xff08;x0&#xff0c;y0&#xff09;&#xff0c;横轴 A&#xff08;长半轴&#xff09;&#xff0c;竖轴 B&#xff08;短半轴&#xff09;&#xff0c;角度 a&#xff0c;则圆边上点&#xff08;x&#xff0c;y&#xff09;的坐标为&#xff1a; 方法一 …

回溯 | Java | LeetCode 39, 40, 131 做题总结

Java Arrays.sort(数组) //排序 不讲究顺序的解答&#xff0c;都可以考虑一下排序是否可行。 39. 组合总和 错误解答 在写的时候需要注意&#xff0c;sum - candidates[i];很重要&#xff0c;也是回溯的一部分。 解答重复了。是因为回溯的for循环理解错了。 class Solutio…

【大模型能力分水岭数学考试,文心一言超gpt4o排名第一】

文末有福利&#xff01; 2024年全国高考成绩陆续放榜&#xff0c;各位考生的成绩怎么样&#xff1f;在本次考试中还有几位特殊的考生——国内外知名的9个AI大模型也“参与”了本次高考&#xff0c;它们的成绩可谓也是“几家欢喜&#xff0c;几家愁”。 以河北省录取分数线&…

深圳数据中心机房搬迁准备

在互联网高度发达的今天&#xff0c;作为业务系统基础设施承载者&#xff0c;数据中心也得到了长足的发展和进步。随着信息系统规模逐渐扩大&#xff0c;应用功能的增多&#xff0c;过去建造的数据中心的面积、配套设施的各个方面都不能满足需求了。大多数使用者需要搬迁到新的…

Android 11.0 SettingsProvider 源码分析

文章目录 一、SettingsProvider 的概述二、SettingsProvider 的启动流程三、对 SettingsProvider 进行操作方法四、客制化示例 一、SettingsProvider 的概述 SettingsProvider 是一个为 Android 系统设置提供数据共享的 Provider&#xff0c;它包含全局、安全和系统级别的用户…

Linux屏幕驱动开发调试笔记

引言 首先了解下什么是MIPI-DSI&#xff1a; MIPI-DSI是一种应用于显示技术的串行接口&#xff0c;兼容DPI(显示像素接口&#xff0c;Display Pixel Interface)、DBI(显示总线接口&#xff0c;Display Bus Interface)和DCS(显示命令集&#xff0c;Display Command Set)&#…

Tech Talk:智能电视eMMC存储的五问五答

智能电视作为搭载操作系统的综合影音载体&#xff0c;以稳步扩大的市场规模走入越来越多的家庭&#xff0c;成为人们生活娱乐的重要组成部分。存储部件是智能电视不可或缺的组成部分&#xff0c;用于保存操作系统、应用程序、多媒体文件和用户数据等信息。智能电视使用eMMC作为…

前端FCP指标优化

优化前 第三方依赖按需引入之后&#xff0c;打包的总体积减小到初始值的55%&#xff0c;但是依然存在很大的js文件&#xff0c;需要继续优化 chunk-vendors.js进行分包之后 截图 compression-webpack-plugin压缩之后 截图

【MySQL备份】Percona XtraBackup总结篇

目录 1.前言 2.问题总结 2.1.为什么在恢复备份前需要准备备份 2.1.1. 保证数据一致性 2.1.2. 完成崩溃恢复过程 2.1.3. 解决非锁定备份的特殊需求 2.1.4. 支持增量和差异备份 2.1.5. 优化恢复性能 2.2.Percona XtraBackup的工作原理 3.注意事项 1.前言 在历经了详尽…

大语言模型系列-Transformer(二)

Transformer 模型的入门可以从以下几个方面开始&#xff1a; 1. 理解基本概念 序列到序列&#xff08;Sequence-to-Sequence&#xff09;任务&#xff1a;Transformer 模型主要用于这类任务&#xff0c;如机器翻译、文本摘要等。注意力机制&#xff08;Attention Mechanism&a…

使用dot来画流程图

Dot是一种图形描述语言&#xff0c;属于Graphviz软件的一部分。Graphviz是一个用于可视化图形&#xff08;图表、网络图等&#xff09;的开源工具集。使用Dot语言&#xff0c;你可以创建并描述节点和边&#xff0c;从而生成图形。以下是如何使用Dot语言画图的基本步骤&#xff…