反转字符串中的单词 II:Swift 实现与详解

打印 上一主题 下一主题

主题 905|帖子 905|积分 2715



      网罗开发   (小红书、快手、视频号同名)   
    大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平常热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等方向。在移动端开发、鸿蒙开发、物联网、嵌入式、云原生、开源等领域有深厚造诣。
图书作者:《ESP32-C3 物联网工程开发实战》
图书作者:《SwiftUI 入门,进阶与实战》
超级个体:COC上海社区主理人
特约讲师:大学讲师,谷歌亚马逊分享嘉宾
科技博主:极星会首批签约作者


  
择要

本文针对 LeetCode 186 题 “反转字符串中的单词 II”,探讨怎样用 Swift 实现一个原地解法来反转字符数组中的单词顺序。通过详细的代码和分析,我们将学习怎样优化代码逻辑并提高解法的服从。

形貌

给定一个字符数组 s,其内容是以空格分隔的单词序列。要求反转单词的顺序,并且不能利用额外的空间。这意味着我们必须原地修改字符数组。
示例 1
  1. 输入:s = ["t", "h", "e", " ", "s", "k", "y", " ", "i", "s", " ", "b", "l", "u", "e"]
  2. 输出:s = ["b", "l", "u", "e", " ", "i", "s", " ", "s", "k", "y", " ", "t", "h", "e"]
复制代码
示例 2
  1. 输入:s = ["a"]
  2. 输出:s = ["a"]
复制代码

题解答案

核心思绪分为以下几步:

  • 反转整个字符数组:将数组团体反转。
  • 逐个反转单词:通过空格分隔单词并反转。
  • 保持原地操作:不分配额外的空间。
以下是完整的 Swift 解法:
题解代码

  1. func reverseWords(_ s: inout [Character]) {
  2.     // Helper function to reverse a section of the array
  3.     func reverse(_ s: inout [Character], _ start: Int, _ end: Int) {
  4.         var start = start
  5.         var end = end
  6.         while start < end {
  7.             s.swapAt(start, end)
  8.             start += 1
  9.             end -= 1
  10.         }
  11.     }
  12.    
  13.     // Step 1: Reverse the entire array
  14.     reverse(&s, 0, s.count - 1)
  15.    
  16.     // Step 2: Reverse each word
  17.     var start = 0
  18.     for i in 0..<s.count {
  19.         if s[i] == " " || i == s.count - 1 {
  20.             reverse(&s, start, i == s.count - 1 ? i : i - 1)
  21.             start = i + 1
  22.         }
  23.     }
  24. }
复制代码
代码分析


  • 核心函数 reverse

    • 接受数组和索引范围,通过双指针互换数组中的字符,原地完成反转。
    • 时间复杂度:O(n)。

  • 团体反转字符数组

    • reverse(&s, 0, s.count - 1) 完成整个数组的反转。

  • 逐个反转单词

    • 遍历数组,当遇到空格或到达结尾时,调用 reverse 对当前单词举行反转。

示例测试及效果

测试代码
  1. var s1: [Character] = ["t", "h", "e", " ", "s", "k", "y", " ", "i", "s", " ", "b", "l", "u", "e"]
  2. reverseWords(&s1)
  3. print(String(s1)) // 输出:blue is sky the
  4. var s2: [Character] = ["a"]
  5. reverseWords(&s2)
  6. print(String(s2)) // 输出:a
复制代码
效果
  1. blue is sky the
  2. a
复制代码
时间复杂度



  • 团体反转数组:O(n)。
  • 遍历并反转单词:O(n)。
  • 总时间复杂度:O(n)。
空间复杂度



  • 利用了原地算法,没有额外空间分配。
  • 空间复杂度:O(1)。
总结


  • 本题通过原地操作有效节省了空间。
  • 解法采用团体反转 + 单词反转的分治思想,逻辑清晰易于实现。
  • 适合在面试中展现数据结构和双指针的纯熟运用。


  • 可以扩展到更复杂的字符串处理场景,比方多种分隔符。
  • 优化代码逻辑,提高可读性和鲁棒性。
参考资料



  • LeetCode 官方题解
  • Swift 官方文档

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

tsx81429

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表