当前位置: 首页 > news >正文

345-反转字符串中的元音字母

前言

今天分享的是反转字符串中的元音字母,原题目要求如下:

编写一个函数,以字符串作为输入,反转该字符串中的元音字母。
示例 1:
输入: "hello"
输出: "holle"

示例 2:
输入: "leetcode"
输出: "leotcede"

说明:
元音字母不包含字母"y"。

补充说明:元音字母为A O E I U a o e i u

解题思路

首先要注意,题目里的要求是把反转字符串中的元音字母,以第一个示例为例子:
从字符串左边遍历的时候,遇到的第一个元音字母所在的索引为1。
而从字符串右边右边遍历的时候,遇到的第一个元音字母所在的索引为4.
所以交换它们的位置、

而我的解题思路是把字符串切割成一个字符数组,从左右两边向中间逼近的方式访问数组。每当检索到左右两边的元音字母就交换位置,直到把所有元素都访问一次后结束。

实现代码

    /**
     * 元音字母列表
     */
    private char[] vowels={'a','o','e','i','u','A','O','E','I','U'};
    /**
     * 反转字符串中的元音字母
     * @param s
     * @return
     */
    public String reverseVowels(String s) {
        char[] chars=s.toCharArray();
        int length=chars.length;//未访问的元素个数
        int leftIndex=0;//从左边访问数组时的索引,模拟指针
        int rightIndex=length-1;//从右边访问数组时的索引,模拟指针
        boolean leftMatch=false;//是否找到符合条件的元素的标志
        boolean rightMatch=false;//是否找到符合条件的元素的标志
        while(length>0){//当未访问元素为0则无需检索元素
            if(isVowel(chars[leftIndex])){//判断从左边开始遍历到元素是否为元音字母
                leftMatch=true;//若是,则记录下标识。停留原位
            }else{
                ++leftIndex;//向右边逼近
                --length;//未访问元素个数减1
            }
            if(isVowel(chars[rightIndex])){//判断从左边开始遍历到元素是否为元音字母
                rightMatch=true;//若是,则记录下标识。停留原位
            }else{
                --rightIndex;//向左边逼近
                --length;//未访问元素个数减1
            }
            if(leftMatch && rightMatch){//若左右都找到元音字母
                //交换位置上的元素
                char tmp=chars[leftIndex];
                chars[leftIndex]=chars[rightIndex];
                chars[rightIndex]=tmp;
                //重置标志位
                leftMatch=false;
                rightMatch=false;
                ++leftIndex;//向右边逼近
                --rightIndex;//向左边逼近
                length=length-2;//未访问元素个数减2
            }

        }
        return String.valueOf(chars);
    }

    /**
     * 判断是否为元音字母
     * @param c
     * @return
     */
    private boolean isVowel(char c){
        for(char vowel:vowels){
            if(vowel==c){
                return true;
            }
        }
        return false;
    }

相关文章:

  • KVO本质的推导
  • canny算子求图像边缘,edgebox那部分
  • 28.week4
  • SQL中Group By的使用
  • 大数据就业前景怎么样?
  • 商品期货趋势交易策略
  • 版本控制工具Git工具快速入门-Linux篇
  • 计算机网络基础:这是一份详细 HTTP 学习指南
  • 避免MySQL出现重复数据处理方法
  • 强如 Disruptor 也发生内存溢出?
  • tomcat介绍和安装
  • 为什么大部分码农做不了软件架构师?
  • WebSocket于HTTP 、WebSocket与Socket的区别
  • WPF中Binding使用StringFormat格式化字符串方法
  • [四] java虚拟机JVM编译器编译代码简介 字节码指令实例 代码到底编译成了什么形式...
  • Docker下部署自己的LNMP工作环境
  • iOS编译提示和导航提示
  • JavaScript创建对象的四种方式
  • java中具有继承关系的类及其对象初始化顺序
  • Mithril.js 入门介绍
  • orm2 中文文档 3.1 模型属性
  • React-flux杂记
  • 安卓应用性能调试和优化经验分享
  • 百度贴吧爬虫node+vue baidu_tieba_crawler
  • 从零开始的无人驾驶 1
  • 翻译--Thinking in React
  • 面试题:给你个id,去拿到name,多叉树遍历
  • 普通函数和构造函数的区别
  • 双管齐下,VMware的容器新战略
  • 微信开源mars源码分析1—上层samples分析
  • 一天一个设计模式之JS实现——适配器模式
  • 译有关态射的一切
  • 因为阿里,他们成了“杭漂”
  • MyCAT水平分库
  • 翻译 | The Principles of OOD 面向对象设计原则
  • ​Base64转换成图片,android studio build乱码,找不到okio.ByteString接腾讯人脸识别
  • ​低代码平台的核心价值与优势
  • $.each()与$(selector).each()
  • (16)UiBot:智能化软件机器人(以头歌抓取课程数据为例)
  • (delphi11最新学习资料) Object Pascal 学习笔记---第2章第五节(日期和时间)
  • (八)Flask之app.route装饰器函数的参数
  • (层次遍历)104. 二叉树的最大深度
  • (二)WCF的Binding模型
  • (附源码)ssm高校实验室 毕业设计 800008
  • (附源码)ssm智慧社区管理系统 毕业设计 101635
  • (生成器)yield与(迭代器)generator
  • (循环依赖问题)学习spring的第九天
  • ... fatal error LINK1120:1个无法解析的外部命令 的解决办法
  • .NET Core 控制台程序读 appsettings.json 、注依赖、配日志、设 IOptions
  • .net FrameWork简介,数组,枚举
  • .net解析传过来的xml_DOM4J解析XML文件
  • .NET精简框架的“无法找到资源程序集”异常释疑
  • @Repository 注解
  • @我的前任是个极品 微博分析
  • [ 蓝桥杯Web真题 ]-布局切换