345

這題 345. Reverse Vowels of a String 算是滿簡單的,也是只要把我們直觀的演算法寫成 code 就好。

直觀想起來的演算法是:

  1. 先看過這個 s 的全部字母,比對每個字母是不是母音,如果是的話就記錄值跟位置
  2. 因為我們已經記得每個母音出現的位置,接下來只要把位置反過來填就好,實作上只要把記錄位置的陣列反向,然後把這些字母重新放進 s 即可

對應到實作就是:

class Solution {
public:
    string reverseVowels(string s) {
        vector<char> vowelVal;
        vector<int>  vowelPos;

        char vowelList[] = { 'a', 'e', 'i', 'o', 'u' };
        char * p;

        for(int i=0; i<s.length(); i++)
        {
            p = std::find (vowelList, vowelList+5, s[i]);
            if (p != vowelList+5)
            {
                vowelVal.push_back(s[i]);
                vowelPos.push_back(i);
            }
        }

        reverse(vowelPos.begin(),vowelPos.end());

        for(int i=0; i<vowelPos.size(); i++)
            s[vowelPos[i]]=vowelVal[i];

        return s;
    }
};

不過這個版本沒有考慮一些特別的 case,第一次 submit 就遇到 s 是 "aA" 時,judge system 說應該要輸出原本的 "Aa",不過我寫的方法會輸出 "aA"。顯然是因為我沒有考慮到大寫的情況,修改一下就可以過了。

class Solution {
public:
    string reverseVowels(string s) {
        vector<char> vowelVal;
        vector<int>  vowelPos;

        char vowelList[] = { 'a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U' };
        char * p;

        for(int i=0; i<s.length(); i++)
        {
            p = std::find (vowelList, vowelList+10, s[i]);
            if (p != vowelList+10)
            {
                vowelVal.push_back(s[i]);
                vowelPos.push_back(i);
            }
        }

        reverse(vowelPos.begin(),vowelPos.end());

        for(int i=0; i<vowelPos.size(); i++)
            s[vowelPos[i]]=vowelVal[i];

        return s;
    }
};

results matching ""

    No results matching ""