大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等方向。在移动端开发、鸿蒙开发、物联网、嵌入式、云原生、开源等领域有深厚造诣。
图书作者:《ESP32-C3 物联网工程开发实战》
图书作者:《SwiftUI 入门,进阶与实战》
超级个体:COC上海社区主理人
特约讲师:大学讲师,谷歌亚马逊分享嘉宾
科技博主:极星会首批签约作者
本文针对 LeetCode 186 题 “反转字符串中的单词 II”,探讨如何用 Swift 实现一个原地解法来反转字符数组中的单词顺序。通过详细的代码和分析,我们将学习如何优化代码逻辑并提高解法的效率。
给定一个字符数组 s
,其内容是以空格分隔的单词序列。要求反转单词的顺序,并且不能使用额外的空间。这意味着我们必须原地修改字符数组。
示例 1:
输入:s = ["t", "h", "e", " ", "s", "k", "y", " ", "i", "s", " ", "b", "l", "u", "e"]
输出:s = ["b", "l", "u", "e", " ", "i", "s", " ", "s", "k", "y", " ", "t", "h", "e"]
示例 2:
输入:s = ["a"]
输出:s = ["a"]
核心思路分为以下几步:
以下是完整的 Swift 解法:
func reverseWords(_ s: inout [Character]) {
// Helper function to reverse a section of the array
func reverse(_ s: inout [Character], _ start: Int, _ end: Int) {
var start = start
var end = end
while start < end {
s.swapAt(start, end)
start += 1
end -= 1
}
}
// Step 1: Reverse the entire array
reverse(&s, 0, s.count - 1)
// Step 2: Reverse each word
var start = 0
for i in 0..<s.count {
if s[i] == " " || i == s.count - 1 {
reverse(&s, start, i == s.count - 1 ? i : i - 1)
start = i + 1
}
}
}
核心函数 reverse
:
O(n)
。整体反转字符数组:
reverse(&s, 0, s.count - 1)
完成整个数组的反转。逐个反转单词:
reverse
对当前单词进行反转。测试代码:
var s1: [Character] = ["t", "h", "e", " ", "s", "k", "y", " ", "i", "s", " ", "b", "l", "u", "e"]
reverseWords(&s1)
print(String(s1)) // 输出:blue is sky the
var s2: [Character] = ["a"]
reverseWords(&s2)
print(String(s2)) // 输出:a
结果:
blue is sky the
a
O(n)
。O(n)
。O(n)
。O(1)
。