今是昨非

今是昨非

日出江花红胜火,春来江水绿如蓝

Algorithem_ReverseWords

Algorithem_ReverseWords#

反轉字串中的單字#

給定一個字串 s,將句子中每個單字的字元順序反轉,同時保留空格和初始單字順序。

範例 1:

輸入: s = "Let's take LeetCode contest"
輸出: "s'teL ekat edoCteeL tsetnoc"

範例 2:

輸入: s = "God Ding"
輸出: "doG gniD"

解法一#

邏輯:
將字串根據空格切割成陣列,然後遍歷陣列,對陣列中的字串調用 reversed 方法,最後再使用空格 join 為字串返回

程式碼如下:


class Solution {
    func reverseWords(_ s: String) -> String {
        let list = s.components(separatedBy: " ")
        var results: [String] = []
        for str in list {
            let reverseStr = String(str.reversed())
            results.append(reverseStr)
        }
        return results.joined(separator: " ")
    }
}

雖然可以得出結果,但是和沒有使用到 TwoPointers 算法,另一種解法是,使用 TwoPointers,先將字串轉為字元陣列,然後遍歷字元陣列,如果當前字元為空格,則對空格前面(兩個空格之間)的元素交換位置。

程式碼如下:


class Solution {
    func reverseWords(_ s: String) -> String {
        var characters = Array(s)
        var start = 0
        var end = 0
        for i in 0..<characters.count {
            let c = characters[i]
            if String(c) == " " {
                // 當前為空格,則 reverse 前面的資料
                end = i - 1 
                swapList(&characters, start, end)
                start = i + 1
            }
        }
        swapList(&characters, start, characters.count-1)
        return String(characters)
    }
    
    func swapList(_ characters: inout [Character], _ start: Int, _ end: Int) {
        var mutStart = start
        var mutEnd = end
        while mutStart < mutEnd {
            characters.swapAt(mutStart, mutEnd)
            mutStart += 1
            mutEnd -= 1
        }
    }
}

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。