反轉一個陣列中的全部母音 思考 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(''); }; ```