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

在这里插入图片描述
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.mzph.cn/pingmian/39727.shtml

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

相关文章

数据库相关学习记录

oracle如何对A-数字-数字类型的字段进行排序 在Oracle中&#xff0c;如果你有一个字段&#xff0c;比如 A-数字-数字 的格式&#xff0c;并且你想要根据这样的格式对数据进行排序&#xff0c;你可以使用 REGEXP_SUBSTR 函数来提取并且转换字符串中的数字部分&#xff0c;然后进…

上海市计算机学会竞赛平台2023年5月月赛丙组滑雪训练

题目描述 小爱最近迷上了滑雪&#xff0c;某滑雪场有 &#x1d45b;n 条不同难度的雪道&#xff0c;只有学习并滑了第 &#x1d456;i 条雪道&#xff0c;才能去参加第 &#x1d456;1i1 条雪道的学习与训练。 已知&#xff0c;第一次滑第 &#x1d456;i 条雪道时&#xff0…

【shell】将txt文件拆成n个,文本均匀按行分布

#!/bin/bash # 原始文件名 source_file"/home/part.txt"# 目标文件存放目录 target_dir"/home"# 想要的近似文件数量 desired_files2 # 请将n替换为具体的数字&#xff0c;比如100# 确保目标目录存在 mkdir -p "$target_dir"# 计算原始文件的…

家用洗地机什么牌子好?四款公认品牌好的机型推荐

每个人都希望自己的家里面能够干干净净&#xff0c;就算不是一尘不染&#xff0c;也至少应该是整洁的&#xff0c;但是在这个快节奏的大环境下&#xff0c;做清洁对于人们来说&#xff0c;不是没时间&#xff0c;就是太累了。正当此时&#xff0c;一款造福懒人的神器——家用洗…

Double 4 VR虚拟仿真教学系统在商务英语课堂上的应用

随着科技的飞速发展&#xff0c;VR&#xff08;虚拟现实&#xff09;技术逐渐在教育领域展现出其独特的魅力。特别是在商务英语课堂上&#xff0c;Double 4 VR虚拟仿真教学系统正逐渐成为一种新颖而有效的教学工具。 一、Double 4 VR虚拟仿真教学系统的引入 在传统的商务英语…

4D 生物打印技术的挑战:从打印到植入,还有多远?

4D生物打印技术将时间维度融入生物打印&#xff0c;为构建具有动态特性和功能的生物组织结构提供了无限可能。然而&#xff0c;要实现这些目标&#xff0c;选择合适的生物打印技术至关重要。本文将详细介绍几种主要的4D生物打印技术&#xff0c;并分析它们各自的优缺点&#xf…

Linux—— 逻辑运算符,压缩和解压缩

- -a&#xff1a; and 逻辑与 - -o&#xff1a; or 逻辑或 - -not&#xff1a; not 逻辑非 - 优先级&#xff1a;与>或>非 shell [rootserver ~]# find / -size 10k -a -size -50k [rootserver ~]# find /etc -name "e*" -o -name "f*"…

前端初学java二(类、多态、接口、内部类、泛型)

目录 类 种类 Javabean类 测试类 工具类 类的初始化 构照函数 新建对象的内存图 static 继承 This Super 虚方法表 Override 修饰符权限 构造代码块 静态代码块 多态 前提 优点 缺点 示例 抽象方法 抽象类 接口 implements 继承 内部类 成员内部类…

centos7安装mysql教程及免费数据库视图软件

文章所有命令最好在根目录&#xff0c;并以root权限 执行 Mysql安装 1. 添加 MySQL Yum Repository MySQL 官方不再维护 CentOS 7 自带的 MySQL 软件包。你需要先下载并安装 MySQL Yum Repository。 sudo yum install https://dev.mysql.com/get/mysql80-community-release…

期末考试题-通过HTML编程Vue3选项式:简易购物车

<!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><!-- 引用 element-plus 样式 --><!-- 注意&#xff1a;复…

React+TS 从零开始教程(4):useEffect

上一节传送门&#xff1a;ReactTS 从零开始教程&#xff08;3&#xff09;&#xff1a;useState 源码链接&#xff1a;https://pan.quark.cn/s/c6fbc31dcb02 上一节&#xff0c;我们已经学会了React的第一个Hook&#xff1a;useState。 这一节&#xff0c;我们要学习的是另一…

C语言----文件操作

1.为什么使用文件&#xff1f; 如果没有⽂件&#xff0c;我们写的程序的数据是存储在电脑的内存中&#xff0c;如果程序退出&#xff0c;内存回收&#xff0c;数据就丢失了&#xff0c;等再次运⾏程序&#xff0c;是看不到上次程序的数据的&#xff0c;如果要将数据进⾏持久化…

Java语言开发的一套智慧产科系统源码:产科专科电子病历系统源码

Java语言开发的一套智慧产科系统源码&#xff1a;产科专科电子病历系统源码 系统概述 电子病历系统是以住院病人为中心&#xff0c;面向医生以及护士为主的&#xff0c;涉及临床治疗、护理等业务的临床信息系统&#xff0c;以电子信息技术为手段&#xff0c;实时采集病人在整个…

【每日一练】Python遍历循环

1. 情节描述&#xff1a;上公交车(10个座位)&#xff0c;并且有座位就可以坐下 要求&#xff1a;输入公交卡当前的余额&#xff0c;只要超过2元&#xff0c;就可以上公交车&#xff1b;如果车上有空座位&#xff0c;才可以上。 seat 10 while seat > 0:money int(input(…

cookie/session/token/jwt

Cookie 定义: Cookie 是服务器发送到用户浏览器并存储在本地的小型数据片段&#xff0c;用于在客户端存储会话信息。 Cookie是Web服务器发送给浏览器的一小段数据&#xff0c;浏览器之后在每次请求同一服务器时会将这段数据回传。Cookie的主要作用是维持用户状态&#xff0c;例…

分层解耦----

分层解耦 类聚 软件中各个功能模块内部的功能联系. 例如: 高类聚示例&#xff1a;想象一下餐厅的厨房&#xff0c;每个厨师负责自己的工作站&#xff0c;一个专门做沙拉&#xff0c;一个专门烤肉&#xff0c;另一个专门做甜点。每个工作站内的工作高度类聚&#xff0c;即每个…

vite项目如何在本地启动https协议

vite项目如何在本地启动https协议 本地启动正常配置在vite.config.js文件中默认启动http协议的请求&#xff0c;如何改成https呢&#xff1f;今天的开发中遇到了这个问题项目需求&#xff1a; 本地启动https协议的前端页面并且正常访问后台https协议的接口 解决方法&#xff1a…

private修饰的方法或属性能被子类继承嘛?

先说结论&#xff1a;能。 这是一个反直觉的问题&#xff0c;毕竟大家在学习阶段接收到的知识就是&#xff1a;被privaite修饰的方法和成员变量不能被继承。 证明过程可参考文档&#xff1a;private修饰的变量如何调用_你真的熟悉java继承关系&#xff1f;那你知道父类private…

Elasticsearch:Runtime fields - 运行时字段(二)

这是继上一篇文章 “Elasticsearch&#xff1a;Runtime fields - 运行时字段&#xff08;一&#xff09;” 的续篇。 在查询时覆盖字段值 如果你创建的运行时字段与映射中已存在的字段同名&#xff0c;则运行时字段会隐藏映射字段。在查询时&#xff0c;Elasticsearch 会评估运…

MySQL 8.0新特性INTERSECT和EXCEPT用于集合运算

MySQL8.0.31 新版本的推出&#xff0c;MySQL增加了对SQL标准INTERSECT和EXCEPT运算符的支持。 1、INTERSECT INTERSECT输出多个SELECT语句查询结果中的共有行。INTERSECT运算符是ANSI/ISO SQL标准的一部分(ISO/IEC 9075-2:2016(E))。 我们运行两个查询&#xff0c;第一个会列…