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

反转字符串中的元音字母:Swift 双指针一步到位

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

文章目录

    • 摘要
    • 描述
    • 痛点分析
    • 题解答案
    • Swift 实现代码
    • 示例测试 & 结果
    • 时间复杂度
    • 空间复杂度
    • 实际开发场景举例
    • 总结

摘要

平时写代码,大家肯定经常要跟字符串打交道,不管是做输入框校验,还是批量清洗文本数据。很多时候,我们只想动字符串里的某些特定字符,比如替换、翻转、排序,其他的都不想碰。这种需求看起来简单,但做起来如果方法不对,就会很麻烦。

今天这道题就是个很典型的例子 —— 反转字符串中的元音字母。听起来小场景,其实在很多实际开发里都能用上,比如输入法候选词处理、用户昵称美化、文本自动化脚本优化等。

我们这次用 Swift 来实现,而且会聊聊这个需求背后的“开发痛点”和“双指针”这种经典解法的妙用。

描述

题目描述其实特别简单粗暴:给你一个字符串,让你把里面所有的元音字母反过来。注意,其他的字母、符号、数字,全都不能动。

元音字母就是 a、e、i、o、u,还有它们的大写版本 A、E、I、O、U。

举个例子:

  • 输入是 IceCreAm
  • 把里面的元音挑出来:I, e, e, A
  • 反转一下:A, e, e, I
  • 最后结果就是 AceCreIm

这种需求在很多实际场景里都很有用,比如:

  • 用户在 App 输入昵称时,你只想改动其中的元音部分,但保持整体格式不变。
  • 文本美化时,根据元音音节去做特殊变换。
  • 游戏里给角色名字做动态反转效果,但又不能打乱字母顺序。

痛点分析

  1. 不能整体反转,只能动“特定字符”
    有些字符串操作(比如翻转整个字符串)一行代码搞定,但像这种只想改动一部分字符,别的还不能动,就麻烦了,简单粗暴的全局方法都不行。

  2. 需要“结构不变”的处理方式
    很多实际需求是“内容变一下,排版不能乱”,尤其是跟 UI 相关的,比如用户昵称、标签文本。这就要求代码既得精准又不能影响原始结构。

  3. 性能要求高,不能用暴力解法
    特别是做批量文本处理的时候,如果你用额外数组去拆解拼装,性能会很拉胯。所以最好的做法就是尽量“原地操作”。

题解答案

解决这类问题,双指针绝对是神器。左右两边一块动,该交换的交换,不该动的直接跳过,效率高还好写。

具体做法:

  1. 把所有元音列出来,放 Set 里查找。
  2. 两个指针 left 和 right,从头和尾一起往中间走。
  3. 左边碰到非元音就右移,右边碰到非元音就左移。
  4. 一旦两个都指向元音,就交换。
  5. 循环走完,搞定。

Swift 实现代码

import Foundationfunc reverseVowels(_ s: String) -> String {var chars = Array(s)  // 把字符串变成数组,方便直接改字符let vowels: Set<Character> = ["a", "e", "i", "o", "u","A", "E", "I", "O", "U"]var left = 0var right = chars.count - 1while left < right {while left < right && !vowels.contains(chars[left]) {left += 1}while left < right && !vowels.contains(chars[right]) {right -= 1}if left < right {chars.swapAt(left, right)left += 1right -= 1}}return String(chars)
}

示例测试 & 结果

试几个例子感受一下:

print(reverseVowels("IceCreAm"))   // 输出: "AceCreIm"
print(reverseVowels("leetcode"))   // 输出: "leotcede"
print(reverseVowels("aA"))         // 输出: "Aa"
print(reverseVowels("swift"))      // 输出: "swift"  // 只有一个元音,不变
print(reverseVowels("AEIOU"))      // 输出: "UOIEA"

简单总结:

  • 元音有多个才会互换,像 swift 这种只有一个的,原样不动。
  • 全是元音的场景下,就会完全翻转。
  • 保持了每个字符原来的位置,其他字母和符号不会乱。

时间复杂度

只走了一遍字符串,复杂度就是 O(n),n 是字符串长度。即使用了双指针,整体遍历次数是不会变多的。

空间复杂度

用了个字符数组复制了一份字符串,空间复杂度是 O(n)
如果在 C++ 这种能直接改原字符串的语言里,可以做到 O(1) 额外空间。

实际开发场景举例

  1. 输入框校验与美化
    比如用户在注册昵称时,App 想让名字的元音部分变得“花哨”点,但又不影响用户输入的顺序。这种只改动局部字符的需求,这个解法就非常合适。

  2. 游戏文本音节调整
    某些游戏为了让角色名字显得“魔性”,会根据元音字母去做反转、替换音节,但又要求整体字母结构不能乱。这道题的方法直接套上去就行。

  3. 批量数据清洗处理
    处理日志、用户数据、文本文件时,需要针对特定字符批量做替换/反转,保持整体格式不乱,这种双指针原地修改就特别高效。

总结

这类“只动部分字符”的字符串题目,其实是开发中很常见但又特别容易掉坑的场景。双指针技巧的妙处就在于:

  • 只关注我们想改的部分;
  • 不动其他字符,保持原样;
  • 性能也能保持在线。

掌握了这个套路,很多看似麻烦的字符串问题都会迎刃而解。

http://www.lryc.cn/news/609784.html

相关文章:

  • 数据在内存中的存储深度解析
  • 【基础完全搜索】USACO Bronze 2019 January - 猜动物Guess the Animal
  • [找出字符串中第一个匹配项的下标]
  • OCR 精准识别验讫章:让登记与校验更智能
  • 嵌入式 - 数据结构:查找至双向链表
  • 用户管理——配置文件和命令
  • 【数据库】使用Sql Server创建索引优化查询速度,一般2万多数据后,通过非索引时间字段排序查询出现超时情况
  • Linux-Shell脚本基础用法
  • 【VSCode】 使用 SFTP 插件实现多服务器同步
  • 随机森林知识点整理:从原理到实战
  • 区块链基础之Merkle树
  • 数据结构——单向链表
  • CMakeLists.txt学习
  • 《JavaScript高级程序设计》读书笔记 35 - 代理捕获器、反射方法以及代理模式
  • React 19 + Next.js 15 中实现混合布局
  • React配置proxy跨域
  • ref和reactive的区别
  • 通过 Flink 和 CDC 从 Oracle 数据库获取增量数据,并将这些增量数据同步到 MySQL 数据库中
  • [GESP202306 四级] 2023年6月GESP C++四级上机题超详细题解,附带讲解视频!
  • Spring Boot + ShardingSphere 实现分库分表 + 读写分离实战
  • AWS VPC Transit Gateway 可观测最佳实践
  • 【物联网】基于树莓派的物联网开发【23】——树莓派安装SQLite嵌入式数据库
  • 16_OpenCV_漫水填充(floodFill)
  • Nginx vs Spring Cloud Gateway:限流功能深度对比与实践指南
  • Spring Cloud Gateway 实现登录校验:构建统一认证入口
  • 图片的放大缩小选择全屏
  • XSS的原型链污染1--原型链解释
  • 笔记本电脑联想T14重启后无法识别外置红米屏幕
  • Django + Vue 项目部署(1panel + openresty)
  • AI“炼金术”:破解绿色水泥的配方密码