题目大意
编写一个函数,以字符串作为输入,反转该字符串中的元音字母。
示例1:
输入: "hello"
输出: "holle"
方法一:双指针
反转类题目考虑用双指针方法,设置两个指针i,j,分别从字符串的头和尾寻找第一个元音,当i和j都是元音,交换位置。
private boolean isVowel(char ch) {
if(ch=='a'|| ch=='e' || ch=='i' || ch=='o' || ch=='u' ||
ch=='A' || ch=='E' || ch=='I' || ch=='O' || ch=='U')
return true;
return false;
}
public String reverseVowels(String s) {
char[] arr = s.toCharArray();
int i = 0, j = arr.length-1;
while(i<j) {
while(!isVowel(arr[i]) && i<j) ++i;
while(!isVowel(arr[j]) && j>i) --j;
char temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
++i;
--j;
}
return new String(arr);
}
运行时间5ms,击败99.08%。
方法二:栈
这个方法需要遍历两次字符串,第一次将所有的元音字母依次入栈,第二次每当遍历到一个元音,就将栈中的元素出栈,然后做替换操作。
public String reverseVowels(String s) {
char[] arr = s.toCharArray();
Stack<Character> stack = new Stack<>();
for(char ch:arr) { //将元音加入栈中
if(isVowel(ch)) stack.push(ch);
}
for(int i=0;i<arr.length;i++) {
if(isVowel(arr[i])) arr[i] = stack.pop();
}
return new String(arr);
}
运行时间12ms,击败64.97%。