当前位置: 首页 > article >正文

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

在这里插入图片描述
在这里插入图片描述

网罗开发 (小红书、快手、视频号同名)

  大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括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"]

题解答案

核心思路分为以下几步:

  1. 反转整个字符数组:将数组整体反转。
  2. 逐个反转单词:通过空格分隔单词并反转。
  3. 保持原地操作:不分配额外的空间。

以下是完整的 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
        }
    }
}

代码分析

  1. 核心函数 reverse

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

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

    • 遍历数组,当遇到空格或到达结尾时,调用 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)

总结

  1. 本题通过原地操作有效节省了空间。
  2. 解法采用整体反转 + 单词反转的分治思想,逻辑清晰易于实现。
  3. 适合在面试中展现数据结构和双指针的熟练运用。
  • 可以扩展到更复杂的字符串处理场景,例如多种分隔符。
  • 优化代码逻辑,提高可读性和鲁棒性。

参考资料

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

http://www.kler.cn/a/507462.html

相关文章:

  • 【AI学习】地平线首席架构师苏箐关于自动驾驶的演讲
  • 【React】静态组件动态组件
  • 频域增强通道注意力机制EFCAM模型详解及代码复现
  • 中间件以及主流中间件产品:IBM MQSeries和BEA Tuxedo介绍
  • jmeter事务控制器-勾选Generate Parent Sample
  • [操作系统] 深入理解约翰·冯·诺伊曼体系
  • Qt之登录界面(splash)
  • PCL 计算点云的均值与标准差【2025最新版】
  • ASP.Net Identity + IODC 解析ReturnUrl
  • 【无线感知会议系列-21 】无线感知6G 研究愿景
  • 电气工程中的计算智能
  • Springboot(五十八)SpringBoot3使用Redisson实现接口的限流功能
  • .Net Core微服务入门全纪录(二)——Consul-服务注册与发现(上)
  • Spring boot学习文档
  • Linux 内核自旋锁spinlock(一)
  • 基于单片机的智能火灾报警系统设计
  • 远程桌面使用是TCP还是UDP?
  • LLM - 大模型 ScallingLaws 的迁移学习与混合训练(PLM) 教程(3)
  • Mysql常见问题处理集锦
  • PTA L1-039 古风排版
  • Bootstrap 下拉菜单
  • 【Redis】Redis大key的危害及解决方案分享
  • WordPress内容保护策略:如何反击并利用被盗内容
  • MySQL数据库入门到大蛇尚硅谷宋红康老师笔记 基础篇 part 5
  • NVIDIA发布个人超算利器project digital,标志着ai元年的开启
  • BERT的中文问答系统64