LeetCode #345 Reverse Vowels of a String 反轉一個字串中的母音

英文原文如下

Given a string s, reverse only all the vowels in the string and return it.

The vowels are ‘a’, ‘e’, ‘i’, ‘o’, and ‘u’, and they can appear in both lower and upper cases, more than once.

中文翻譯

給予一個字串 s,反轉其中出現的所有母音並回傳。

母音是 ‘a’, ‘e’, ‘i’, ‘o’, 跟 ‘u’,然後他們可以同時出現大寫或是小寫,並多於一次。

範例及題目限制


解題思路

在我們的解決方法中,我們使用兩個List來分別儲存母音以及它們出現的索引位置。

再來我們會先反轉全部母音,並依照索引將它們取代回去。

我們可以使用兩個for 迴圈來輕鬆達成。

C# 解決方案

方案1

public class Solution {
    public string ReverseVowels(string s) {
        char[] vowelList = { 'a', 'e', 'i', 'o', 'u','A', 'E', 'I', 'O', 'U' };
        List<char>list = new List<char>();
        List<int>idxList = new List<int>();

        char[] charArr = s.ToCharArray();

        for(int i=0; i<charArr.Count();i++)
        {
            var now = charArr[i];
            if(vowelList.Contains(now))
            {
                list.Add(now);
                idxList.Add(i);
            }
        }

        list.Reverse(); //LINQ

        for(int j=0; j<idxList.Count();j++)
        {
            charArr[idxList[j]] = list[j];
        }

        return new string(charArr);
    }
}

一切都很好,但可以稍微降低第二個迴圈的次數。

方案2

public class Solution {
    public string ReverseVowels(string s) {
        char[] vowelList = { 'a', 'e', 'i', 'o', 'u','A', 'E', 'I', 'O', 'U' };
        List<char> list = new List<char>();
        List<int> idxList = new List<int>();

        char[] charArr = s.ToCharArray();

        for (int i = 0; i < charArr.Length; i++) {
            var now = charArr[i];
            if (vowelList.Contains(now)) {
                list.Add(now);
                idxList.Add(i);
            }
        }

        list.Reverse();

        for (int j = 0; j < idxList.Count / 2; j++) {
            charArr[idxList[j]] = list[j];
            charArr[idxList[idxList.Count-1-j]] = list[idxList.Count-1-j];
        }

        return new string(charArr);
    }
}

Java解決方案

方案1

class Solution {
    public String reverseVowels(String s) {
        List<Character> vowelList =  Arrays.asList('a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U');
        List<Character> list = new ArrayList<>();
        List<Integer> idxList = new ArrayList<>();

        char[] charArr = s.toCharArray();

        for (int i = 0; i < charArr.length; i++) {
            char now = charArr[i];
            if (vowelList.contains(now)) {
                list.add(now);
                idxList.add(i);
            }
        }

        Collections.reverse(list);

        for (int j = 0; j < idxList.size() / 2; j++) {
            charArr[idxList.get(j)] = list.get(j);
            charArr[idxList.get(idxList.size() - 1 - j)] = list.get(idxList.size() - 1 - j);
        }
        return new String(charArr);
    }
}

方案2 – 將母音的判斷List 改為 HashSet來判斷

class Solution {
    public String reverseVowels(String s) {
        Set<Character> vowelList = new HashSet<>(Arrays.asList('a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U'));
        List<Character> list = new ArrayList<>();
        List<Integer> idxList = new ArrayList<>();

        char[] charArr = s.toCharArray();

        for (int i = 0; i < charArr.length; i++) {
            char now = charArr[i];
            if (vowelList.contains(now)) {
                list.add(now);
                idxList.add(i);
            }
        }

        Collections.reverse(list);

        for (int j = 0; j < idxList.size() / 2; j++) {
            charArr[idxList.get(j)] = list.get(j);
            charArr[idxList.get(idxList.size() - 1 - j)] = list.get(idxList.size() - 1 - j);
        }
        return new String(charArr);
    }
}

結論

每次寫英文的文章時候,永遠不記得 i 到底是不是母音,所以在a 跟 an 之間永遠猶豫了很久哈哈哈~

🧡如果這篇文章有幫上你的一點點忙,那是我的榮幸

🧡收藏文章或幫我點個廣告,那都是對我的支持

✅如有任何疑問,歡迎透過留言或messenger讓我知道 !

題目連結 : Reverse Vowels of a String – LeetCode

一些隨機的LeetCode文章

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *