反转字符串中的单词 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 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.mzph.cn/news/892997.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

51c大模型~合集106

我自己的原文哦~ https://blog.51cto.com/whaosoft/13115290 #GPT-5、 Opus 3.5为何迟迟不发 新猜想&#xff1a;已诞生&#xff0c;被蒸馏成小模型来卖 「从现在开始&#xff0c;基础模型可能在后台运行&#xff0c;让其他模型能够完成它们自己无法完成的壮举——就像一个老…

机器学习(2):线性回归Python实现

1 概念回顾 1.1 模型假设 线性回归模型假设因变量y yy与自变量x xx之间的关系可以用以下线性方程表示&#xff1a; y β 0 β 1 ⋅ X 1 β 2 ⋅ X 2 … β n ⋅ X n ε y 是因变量 (待预测值)&#xff1b;X1, X2, ... Xn 是自变量&#xff08;特征&#xff09;β0, β1,…

AUTOSAR通信篇 - PDU和收发数据

点击订阅专栏不迷路 文章目录 一、概述二、OSI模型与AUTOSAR层级关系三、I-PDU、N-PDU、L-PDU及其关系3.1. L-PDU3.2. N-PDU3.3. I-PDU 四、数据流4.1. 普通数据流4.2. 诊断数据流4.3. 动态PDU数据流4.4. 安全通信数据流4.5. XCP数据流 返回总目录 一、概述 在学习Autosar通信…

《自动驾驶与机器人中的SLAM技术》ch4:预积分学

目录 1 预积分的定义 2 预积分的测量模型 ( 预积分的测量值可由 IMU 的测量值积分得到 ) 2.1 旋转部分 2.2 速度部分 2.3 平移部分 2.4 将预积分测量和误差式代回最初的定义式 3 预积分的噪声模型和协方差矩阵 3.1 旋转部分 3.2 速度部分 3.3 平移部分 3.4 噪声项合并 4 零偏的…

2025年01月蓝桥杯Scratch1月stema选拔赛真题—美丽的图形

美丽的图形 编程实现美丽的图形具体要求: 1)点击绿旗&#xff0c;角色在舞台中心&#xff0c;如图所示&#xff1b; 2)1秒后&#xff0c;绘制一个边长为 140的红色大正方形&#xff0c;线条粗细为 3&#xff0c;正方形的中心为舞台中心&#xff0c;如图所示; 完整题目可点击下…

58,【8】BUUCTF [PwnThyBytes 2019]Baby_SQL1

进入靶场 和2次注入的页面很像 不过养成查看源代码的好习惯 先访问source.zip 下载后解压&#xff0c;发现两个文件 第一个文件夹打开又有4个PHP文件 那还是先看index.php文件好了 有PHP和HTML两部分&#xff0c;下面是PHP部分代码&#xff08;HTML太长了&#xff0c;先放一…

Linux系统上安装最新版本的谷歌浏览器

要在您的 Linux 系统上安装最新版本的 Google Chrome 浏览器&#xff0c;您可以按照以下步骤进行操作&#xff1a; 方法一&#xff1a;通过 DEB 包安装&#xff08;适用于 Debian、Ubuntu 及其衍生版&#xff09; 下载 Google Chrome DEB 安装包&#xff1a; 打开您现有的浏览…

AI编程工具横向评测--Cloudstudio塑造完全态的jupyter notebook助力数据分析应用开发

AI编程工具横向评测–Cloudstudio塑造完全态的jupyter notebook助力数据分析应用开发 数据分析类应用的开发&#xff0c;指的是首先进行数据分析&#xff0c;比如统计学分析、机器学习模型的构建等&#xff0c;然后将分析的流程开发成数据分析类的工具&#xff0c;或者将数据分…

医疗集群系统中基于超融合数据库架构的应用与前景探析

一、引言 1.1 研究背景与意义 随着医疗信息化的飞速发展,医疗数据呈爆炸式增长。从日常诊疗记录、患者病历,到各类医疗影像、检查检验数据等,海量信息不断涌现。据统计,医疗数据的年增长率高达 30% 以上 ,2025 年,全球医疗数据量将达到 2314 艾字节(EB)。如此庞大的数…

vue项目引入阿里云svg资源图标

1&#xff1a;生成svg图标 登录阿里云官网 1.1 创建项目组 1.2 从阿里云网站上面获取喜欢的图标加入到已有的项目组 1.3 如果团队有自己的设计师&#xff0c;也可以让设计师上传自己的svg图标到阿里云指定的项目组&#xff1b; 使用的时候&#xff0c;把 资源包下载到本地项…

网络安全面试题汇总(个人经验)

1.谈一下SQL主从备份原理&#xff1f; 答&#xff1a;主将数据变更写入自己的二进制log,从主动去主那里去拉二进制log并写入自己的二进制log,从而自己数据库依据二进制log内容做相应变更。主写从读 2.linux系统中的计划任务crontab配置文件中的五个星星分别代表什么&#xff…

立创开发板入门第六课 音频-扬声器和麦克风 I2S驱动

音频芯片介绍 开发板上带有一个麦克风&#xff0c;一个扬声器&#xff0c;音频编解码芯片使用ES8311。麦克风直接连接到了ES8311芯片上&#xff0c;ES8311和扬声器之间&#xff0c;还有一个音频驱动放大器。ES8311通过I2S接口与ESP32-C3连接。 ES8311这个芯片不仅使用I2S接口…

pix2pix mmgeneration通用场景黑白图片上色模型训练,Docker

https://www.dong-blog.fun/post/1924 对于机器学习和深度学习感兴趣的读者来说,OpenMMLab 提供的 MMGeneration 库是一个绝佳的选择。最近我在阅读一篇关于 MMGeneration 的博客文章,尤其是在使用 Docker 环境进行模型和算法测试方面,受益匪浅。以下是我对目标博客内容的概…

数据仓库复用性:业务需求复用性设计

数据仓库的业务需求复用性设计是提升数据架构灵活性和扩展性的关键部分。以下是几个关键点&#xff0c;可以帮助实现业务需求复用性的设计&#xff1a; 1. 通用报表的复用 标准化数据模型&#xff1a;设计通用的数据模型&#xff0c;例如通用的事实表和维度表&#xff0c;使得…

Elasticsearch:Jira 连接器教程第二部分 - 6 个优化技巧

作者&#xff1a;来自 Elastic Gustavo Llermaly 将 Jira 连接到 Elasticsearch 后&#xff0c;我们现在将回顾最佳实践以升级此部署。 在本系列的第一部分中&#xff0c;我们配置了 Jira 连接器并将对象索引到 Elasticsearch 中。在第二部分中&#xff0c;我们将回顾一些最佳实…

5 分钟复刻你的声音,一键实现 GPT-Sovits 模型部署

想象一下&#xff0c;只需简单几步操作&#xff0c;就能生成逼真的语音效果&#xff0c;无论是为客户服务还是为游戏角色配音&#xff0c;都能轻松实现。GPT-Sovits 模型&#xff0c;其高效的语音生成能力为实现自然、流畅的语音交互提供了强有力的技术支持。本文将详细介绍如何…

解压必须用tar -zxvf?

答案是必须的哈 tar -zxvf 是一个常用于 Linux/Unix 系统的命令&#xff0c;用来解压 .tar.gz 或 .tgz 格式的文件。命令中的 tar 是一个归档工具&#xff0c;用于创建和处理压缩文件。当你使用 -zxvf 选项时&#xff0c;每个字母都有不同的含义。-z 告诉 tar 使用 gzip 来解压…

nginx 的基础语法学习,零基础学习

学习 Nginx 的主要语法和配置选项对于有效地管理和优化 Web 服务器非常重要。以下是一些关键的 Nginx 语法和概念&#xff0c;涵盖了基本配置、反向代理、负载均衡、缓存等方面。 基本语法 配置文件结构 Nginx 配置文件通常位于 /etc/nginx/nginx.conf 或 /usr/local/nginx/co…

WebSocket实现分布式的不同方案对比

引言 随着实时通信需求的日益增长&#xff0c;WebSocket作为一种基于TCP的全双工通信协议&#xff0c;在实时聊天、在线游戏、数据推送等场景中得到了广泛应用。然而&#xff0c;在分布式环境下&#xff0c;如何实现WebSocket的连接管理和消息推送成为了一个挑战。本文将对比几…

【CSS】---- CSS 实现超过固定高度后出现展开折叠按钮

1. 实现效果 2. 实现方法 使用 JS 获取盒子的高度&#xff0c;来添加对应的按钮和样式&#xff1b;使用 CSS 的浮动效果&#xff0c;参考CSS 实现超过固定高度后出现展开折叠按钮&#xff1b;使用容器查询 – container 语法&#xff1b;使用 clamp 函数进行样式判断。 3. 优…