題目大意
編寫一個(gè)函數(shù),以字符串作為輸入,反轉(zhuǎn)該字符串中的元音字母。
示例1:
輸入: "hello"
輸出: "holle"
方法一:雙指針
反轉(zhuǎn)類題目考慮用雙指針方法,設(shè)置兩個(gè)指針i,j,分別從字符串的頭和尾尋找第一個(gè)元音,當(dāng)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);
}
運(yùn)行時(shí)間5ms,擊敗99.08%。
方法二:棧
這個(gè)方法需要遍歷兩次字符串,第一次將所有的元音字母依次入棧,第二次每當(dāng)遍歷到一個(gè)元音,就將棧中的元素出棧,然后做替換操作。
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);
}
運(yùn)行時(shí)間12ms,擊敗64.97%。