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

news/2025/1/19 6:14:18/

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

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

  大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括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 arrayfunc reverse(_ s: inout [Character], _ start: Int, _ end: Int) {var start = startvar end = endwhile start < end {s.swapAt(start, end)start += 1end -= 1}}// Step 1: Reverse the entire arrayreverse(&s, 0, s.count - 1)// Step 2: Reverse each wordvar start = 0for 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 thevar 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.ppmy.cn/news/1564327.html

相关文章

React实现拖拽特效

前言 最近&#xff0c;我看到一个工程师的个人网站上&#xff0c;采用了拖拽作品集的互动特效&#xff0c;既有趣又吸引眼球。经过一些研究&#xff0c;我发现其实借助一些现成的套件&#xff0c;就能轻松实现这样的效果。今天就带大家一起看看&#xff0c;如何通过 Framer Mo…

提示词的艺术----AI Prompt撰写指南(个人用)

提示词的艺术 写在前面 制定提示词就像是和朋友聊天一样&#xff0c;要求我们能够清楚地表达问题。通过这个过程&#xff0c;一方面要不断练习提高自己地表达能力&#xff0c;另一方面还要锻炼自己使用更准确精炼的语言提出问题的能力。 什么样的提示词有用&#xff1f; 有…

阻塞赋值和非阻塞赋值

理论学习 阻塞赋值 用 表示 &#xff0c;这种对应的电路结构常常与触发器没有关系&#xff0c;只与输入电平的变化有关系。可以将阻塞赋值的操作看作只有一个步骤的操作&#xff0c;即将计算赋值符号的右边赋值给左边&#xff0c;在未执行完之前&#…

设计模式(4)行为模式

行为模式 1. Chain of Responsibility Pattern&#xff08;责任链模式&#xff09;2.Command Pattern&#xff08;命令模式&#xff09;3.Interpreter Pattern&#xff08;解释器模式&#xff09;▲4.Iterator&#xff08;迭代器模式&#xff09;5.Mediator&#xff08;中介者模…

机器学习-基本术语

文章目录 1. **数据集&#xff08;Dataset&#xff09;**2. **样本&#xff08;Sample&#xff09;**3. **属性&#xff08;Attribute&#xff09;**4. **特征&#xff08;Feature&#xff09;**5. **属性值&#xff08;Attribute Value&#xff09;**6. **属性空间&#xff08…

【机器学习:二十一、避免高偏差和高方差】

定性分析&#xff1a;训练误差与验证误差的关系 在构建机器学习模型时&#xff0c;高偏差和高方差是两种常见的问题。高偏差通常意味着模型过于简单&#xff0c;未能很好地捕捉数据的复杂特性&#xff0c;导致训练误差和验证误差都较高。高方差则表示模型过度拟合&#xff0c;…

【2024年华为OD机试】(B卷,100分)- 数据分类 (Java JS PythonC/C++)

一、问题描述 题目描述 对一个数据a进行分类&#xff0c;分类方法为&#xff1a; 此数据a&#xff08;四个字节大小&#xff09;的四个字节相加对一个给定的值b取模&#xff0c;如果得到的结果小于一个给定的值c&#xff0c;则数据a为有效类型&#xff0c;其类型为取模的值&…

【原创】大数据治理入门(2)《提升数据质量:质量评估与改进策略》入门必看 高赞实用

提升数据质量&#xff1a;质量评估与改进策略 引言&#xff1a;数据质量的概念 在大数据时代&#xff0c;数据的质量直接影响到数据分析的准确性和可靠性。数据质量是指数据在多大程度上能够满足其预定用途&#xff0c;确保数据的准确性、完整性、一致性和及时性是数据质量的…