1、翻转字符串
Given s = "the sky is blue",
return "blue is sky the".
// 交换数组中两个元素的位置
func swap<T>(_ chars: inout [T], _ p: Int, _ q: Int) {
(chars[p], chars[q]) = (chars[q], chars[p])
}
// 翻转数组中指定范围的元素
func reverse<T>(_ chars: inout [T], _ start: Int, _ end: Int) {
var start = start, end = end
// 这个循环里从两头开始交换元素直到start大于end说明替换完成
while start < end {
swap(&chars, start, end)
start += 1
end -= 1
}
}
func reverseWords(s: String?) -> String? {
guard let s = s else {
return nil
}
var chars = Array(s), start = 0
// 1、翻转整个字符串
reverse(&chars, 0, chars.count - 1)
// 2、每个单词作为一个字符串单独翻转
for i in 0 ..< chars.count {
// 遍历字符串,如果当前位置的下一个字符是空格或者当前字符是整个字符串的最后一个字符时可以认为从start位置到当前位置的字符串是一个单独的单词
if chars[i + 1] == " " || i == chars.count - 1 {
// 翻转单独的单词
reverse(&chars, start, i)
start = i + 2
}
}
return String(chars)
}
let str = "the blue is sky"
print(reverseWords(s: str) ?? "")