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
}
}
}