前言
今天分享的是反转字符串中的元音字母,原题目要求如下:
编写一个函数,以字符串作为输入,反转该字符串中的元音字母。
示例 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;
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。