反轉一個陣列中的全部母音
思考
1.掃一次用一個vector<char>放蒐集到的母音
2.掃一次找到母音從尾端開始放 結束
```c++=
class Solution {
public:
string reverseVowels(string s) {
//用一個vector紀錄得到的母音
vector <char> temp;
int n = s.size();
for(int i = 0; i < n; i++){
//先把母音都抓下來
if(s[i] == 'a' || s[i] == 'e' || s[i] == 'i' || s[i] == 'o' || s[i] == 'u' || s[i] == 'A' || s[i] == 'E' || s[i] == 'I' \
|| s[i] == 'O' || s [i] == 'U'){
temp.push_back(s[i]);
}
}
int m = temp.size();
for(int i = 0; i < n; i++){
if(s[i] == 'a' || s[i] == 'e' || s[i] == 'i' || s[i] == 'o' || s[i] == 'u' || s[i] == 'A' || s[i] == 'E' || s[i] == 'I' \
|| s[i] == 'O' || s [i] == 'U'){
s[i] = temp[m-1];
m--;
}
}
return s;
}
};
```
思考
1.用while 從陣列前後找到母音 做交換 直到 前 < 後
```c++
class Solution {
public:
bool isVowels(char p){
if(p == 'a' || p == 'e' || p == 'i' || p == 'o' \
|| p == 'u' || p == 'A' || p == 'E' || p == 'I' \
|| p == 'O' || p == 'U'){
return true;
}else{
return false;
}
}
string reverseVowels(string s) {
//用雙指標 頭尾交換
//結束點是前指標大於後指標
//利用token去控制前後指標的停止,可以省略用while再left去找母音
int n = s.size();
int left = 0;
int right = n - 1;
//利用token紀錄前後指標有無找到母音
bool tk1 = 0, tk2 = 0;
while(left < right){
//先找到前指標的母音
if( (!tk1) && isVowels(s[left])){
//如果找到前指標的母音
tk1 = 1;
}else if(tk1 == 0){
//如果還沒有找到前指標母音則指標前進
left++;
}
if( (!tk2) && isVowels(s[right])){
//如果找到前指標的母音
tk2 = 1;
}else if(tk2 == 0){
//如果還沒有找到後指標母音則指標後退
right--;
}
//如果前後指標都找到母音
if(tk1 && tk2){
//SWAP母音
swap(s[left], s[right]);
tk1 = 0;
tk2 = 0;
left++;
right--;
}
}
return s;
}
};
```
```=
/**
* @param {string} s
* @return {string}
*/
var reverseVowels = function(s) {
const VOWELS = {
'a' : 1,
'e' : 1,
'i' : 1,
'o' : 1,
'u' : 1,
'A' : 1,
'E' : 1,
'I' : 1,
'O' : 1,
'U' : 1,
}
const arr = s.split('');
let left = 0;
let right = s.length-1;
while(left < right){
if(VOWELS[arr[left]] && VOWELS[arr[right]]){
[arr[left], arr[right]] = [arr[right], arr[left]];
left++;
right--;
}else if(VOWELS[arr[left]]){
right--;
}else{
left++;
}
}
return arr.join('');
};
```