前言

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

编写一个函数,以字符串作为输入,反转该字符串中的元音字母。
示例 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;
    }

Null
137 声望31 粉丝

免费的东西是最贵的,好走的只是下坡路