LeetCode 151:字符串单词反转的算法实现与优化
1. 问题背景与需求分析151.反转字符串中的单词是LeetCode上一道经典的字符串处理题目。题目要求我们反转字符串中单词的顺序同时需要处理多余空格的问题。具体来说给定一个可能包含前导、尾随或单词间多个空格的字符串我们需要返回单词顺序反转且单词间用单个空格分隔的结果字符串。这道题看似简单但实际考察了多个字符串处理的核心能力字符串的遍历与操作空格处理与字符串分割数组/列表的反转操作字符串拼接的效率考量在实际编程面试中这类题目经常作为热身题出现。根据我的面试经验大约60%的候选人能写出基本解法但只有不到30%能给出最优解并解释清楚时空复杂度。这道题在2023年LeetCode周赛中出现过变种也是热门100题的常客。2. 核心解法思路拆解2.1 基础解法利用语言内置函数最直观的解法是利用编程语言提供的字符串处理函数def reverseWords(s: str) - str: return .join(reversed(s.split()))这种解法简洁明了但面试官通常会追问如果不允许使用split()和reversed()你会如何实现注意虽然这种解法代码简洁但在实际面试中直接调用高级API可能无法充分展示你的算法能力。建议掌握底层实现方法。2.2 手动实现的标准解法更符合面试要求的解法是手动实现整个过程去除首尾空格反转整个字符串反转每个单词处理单词间多余空格def reverseWords(s: str) - str: # 去除首尾空格 s s.strip() # 反转整个字符串 s list(s) n len(s) self.reverse(s, 0, n-1) # 反转每个单词并处理空格 i j 0 while i n: while j n and s[j] ! : j 1 self.reverse(s, i, j-1) # 处理多余空格 while j n and s[j] : j 1 i j # 处理单词间多余空格 slow fast 0 while fast n: if s[fast] ! : s[slow] s[fast] slow 1 elif slow 0 and s[slow-1] ! : s[slow] slow 1 fast 1 return .join(s[:slow]) def reverse(self, s, left, right): while left right: s[left], s[right] s[right], s[left] left 1 right - 12.3 双指针优化解法对于追求极致效率的场景可以使用双指针从后向前遍历def reverseWords(s: str) - str: res [] n len(s) i n - 1 while i 0: if s[i] : i - 1 continue j i while j 0 and s[j] ! : j - 1 res.append(s[j1:i1]) i j return .join(res)3. 复杂度分析与优化考量3.1 时间复杂度比较解法类型时间复杂度空间复杂度内置函数法O(n)O(n)手动实现法O(n)O(n)双指针法O(n)O(n)虽然三种解法的时间复杂度相同但实际性能有差异内置函数法实际最快因为底层用C实现双指针法避免了多次反转操作常数时间更优手动实现法代码量大但展示了完整思路3.2 语言特性考量不同语言实现时需要注意Python字符串不可变通常转为list处理JavaStringBuilder更高效C可以原地修改字符串以Java为例的优化实现public String reverseWords(String s) { StringBuilder sb new StringBuilder(); int end s.length() - 1; while (end 0) { if (s.charAt(end) ) { end--; continue; } int start end; while (start 0 s.charAt(start) ! ) { start--; } sb.append(s.substring(start 1, end 1)).append( ); end start; } return sb.toString().trim(); }4. 常见错误与边界情况4.1 典型错误案例未处理前导/尾随空格# 错误示例 def reverseWords(s: str) - str: words s.split( ) # 使用单个空格分割会保留空字符串 return .join(reversed([w for w in words if w]))多余空格处理不当# 错误示例 - 单词间可能仍有多个空格 def reverseWords(s: str) - str: s s.strip() return .join(reversed(s.split()))原地修改时的索引错误# 错误示例 - 反转时索引处理不当 def reverse(s, left, right): while left right: s[left], s[right] s[right], s[left] left 1 # 缺少right - 14.2 边界测试用例必须测试的边界情况全空格字符串 单个单词hello前后有空格 hello world 单词间多个空格a good example超长字符串性能测试5. 实际应用与变种题目5.1 工程应用场景这种字符串处理技术在以下场景有实际应用搜索引擎的查询预处理文本编辑器的格式整理日志处理系统的信息提取自然语言处理的预处理阶段5.2 相关变种题目反转字符串IILeetCode 541每隔2k字符反转前k个反转字符串中的元音LeetCode 345只反转元音字母旋转字符串LeetCode 796检查是否可以通过旋转得到反转单词顺序列剑指Offer 58-I类似本题5.3 面试技巧在面试中遇到此类题目时先确认输入输出要求是否原地修改、空格处理等提出暴力解法并分析复杂度逐步优化解释每个优化点的考虑主动提出测试用例特别是边界情况讨论可能的实际应用场景6. 性能优化进阶对于特别大的字符串如处理整个文档可以考虑分块处理将字符串分成适当大小的块分别处理并行处理对不同的单词块使用多线程反转内存映射对于极大文件使用内存映射文件技术C示例的分块处理std::string reverseWords(std::string s) { std::reverse(s.begin(), s.end()); int storeIndex 0; for (int i 0; i s.size(); i) { if (s[i] ! ) { if (storeIndex ! 0) s[storeIndex] ; int j i; while (j s.size() s[j] ! ) s[storeIndex] s[j]; std::reverse(s.begin() storeIndex - (j - i), s.begin() storeIndex); i j; } } s.erase(s.begin() storeIndex, s.end()); return s; }7. 语言特定实现技巧7.1 Python优化技巧使用列表推导式更简洁def reverseWords(s: str) - str: return .join([word for word in reversed(s.split())])使用re模块处理复杂空格import re def reverseWords(s: str) - str: return .join(reversed(re.split(r\s, s.strip())))7.2 Java注意事项使用StringBuilder而非String拼接注意trim()和split()的性能开销考虑使用StringTokenizer已过时但面试中可能讨论7.3 C实现要点使用std::reverse进行原地反转注意字符串的erase操作效率考虑使用istringstream进行单词分割8. 测试与验证方法8.1 单元测试编写完善的测试应包含import unittest class TestReverseWords(unittest.TestCase): def test_normal_case(self): self.assertEqual(reverseWords(the sky is blue), blue is sky the) def test_leading_trailing_spaces(self): self.assertEqual(reverseWords( hello world ), world hello) def test_multiple_spaces(self): self.assertEqual(reverseWords(a good example), example good a) def test_single_word(self): self.assertEqual(reverseWords(hello), hello) def test_empty_string(self): self.assertEqual(reverseWords(), ) if __name__ __main__: unittest.main()8.2 性能测试方法对于大规模字符串的性能测试import time def test_performance(): # 生成超长测试字符串 long_str .join([word] * 1000000) start time.time() reverseWords(long_str) end time.time() print(fProcessing 1,000,000 words took: {end-start:.2f} seconds)9. 学习路径建议要系统掌握这类字符串处理问题建议先掌握基本的字符串操作遍历、切片、拼接常用方法split, join, strip等练习相关基础题目反转字符串LeetCode 344反转字符串IILeetCode 541反转元音字母LeetCode 345进阶到更复杂问题字符串解码LeetCode 394字符串转换整数LeetCode 8有效的字母异位词LeetCode 242最后挑战综合应用字符串相乘LeetCode 43简化路径LeetCode 71文本对齐LeetCode 68

相关新闻

3分钟永久备份你的QQ空间:GetQzonehistory让青春记忆永不丢失

3分钟永久备份你的QQ空间:GetQzonehistory让青春记忆永不丢失

3分钟永久备份你的QQ空间:GetQzonehistory让青春记忆永不丢失 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 还记得那些年在QQ空间里记录的点滴时光吗?那些承载…

2026/8/4 10:54:08 阅读更多 →
智慧慢病管理平台源码

智慧慢病管理平台源码

全域数据互通 AI智能赋能 三级联动管理慢性病已成为威胁国民健康的首要问题。据统计,我国慢性病患者超过3亿,慢病导致的死亡占全部死亡的88%,疾病负担占总疾病的70%以上。如何实现慢病患者的全生命周期管理?如何让基层医疗机构也…

2026/8/4 10:54:08 阅读更多 →
Sketchfab模型免费下载终极指南:Firefox浏览器一键获取3D资源

Sketchfab模型免费下载终极指南:Firefox浏览器一键获取3D资源

Sketchfab模型免费下载终极指南:Firefox浏览器一键获取3D资源 【免费下载链接】sketchfab sketchfab download userscipt for Tampermonkey by firefox only 项目地址: https://gitcode.com/gh_mirrors/sk/sketchfab 还在为Sketchfab平台上精美的3D模型无法下…

2026/8/4 10:54:08 阅读更多 →

最新新闻

【AI写作思维跃迁指南】:20年资深技术专家亲授5大AI辅助构思心法,90%的作者都忽略了第3步?

【AI写作思维跃迁指南】:20年资深技术专家亲授5大AI辅助构思心法,90%的作者都忽略了第3步?

更多请点击: https://intelliparadigm.com 第一章:AI写作思维跃迁的底层认知重构 传统写作依赖线性构思、经验沉淀与反复修改,而AI写作要求创作者首先完成一场静默的认知重装——从“作者中心”转向“提示工程师语义协作者”的双重身份。这种…

2026/8/4 11:42:37 阅读更多 →
AI生成的设计规范为何被设计委员会集体否决?——揭秘92%失败案例中的3层元规范缺失(附ISO/IEC 24613兼容检测表)

AI生成的设计规范为何被设计委员会集体否决?——揭秘92%失败案例中的3层元规范缺失(附ISO/IEC 24613兼容检测表)

更多请点击: https://codechina.net 第一章:AI生成的设计规范为何被设计委员会集体否决? 当某大型金融科技平台尝试用LLM批量生成《移动端组件交互设计规范v2.0》时,AI输出的文档在评审会上遭遇100%否决。问题不在于语法错误或格…

2026/8/4 11:42:37 阅读更多 →
第六阶段 54 · ingest pipeline 摄取管道(写入时加工数据)

第六阶段 54 · ingest pipeline 摄取管道(写入时加工数据)

54 ingest pipeline 摄取管道(写入时加工数据)阶段:第六阶段 / 进阶专题 ES:ingest pipeline processors | PostgreSQL:BEFORE INSERT 触发器 / ETL 转换1. 概念 ingest pipeline 让文档在写入索引之前先过一串 proc…

2026/8/4 11:42:37 阅读更多 →
Ubuntu 14.04解决Firefox无法播放小红书视频问题

Ubuntu 14.04解决Firefox无法播放小红书视频问题

1. 问题现象与背景分析最近在Ubuntu 14.04.6系统上使用自带的Firefox浏览器访问小红书时,发现视频内容无法正常播放。这个问题困扰了不少还在使用这个经典LTS版本的用户。作为一款2019年发布的系统,Ubuntu 14.04.6虽然稳定,但内置的软件包版本…

2026/8/4 11:42:37 阅读更多 →
实测 3 款热门变声器:叮咚变声器凭什么是手机首选?不吹说真话

实测 3 款热门变声器:叮咚变声器凭什么是手机首选?不吹说真话

家人们谁懂啊!想找个好用的变声器真的太难了,要么全是广告弹窗,要么变出来的声音机械感拉满,一开口就被队友识破 "电子音"。作为一个平时爱打游戏、偶尔搞短视频配音的普通人,我前前后后踩了不下十个坑。今天…

2026/8/4 11:42:37 阅读更多 →
KNN算法在Matlab中实现手写字母识别

KNN算法在Matlab中实现手写字母识别

1. 项目概述:KNN算法与手写字母识别的完美结合手写字母识别一直是模式识别领域的经典问题,而K近邻算法(KNN)因其简单直观的特性,成为入门机器学习的最佳选择之一。我在实际项目中发现,KNN算法对于小规模手写…

2026/8/4 11:41:37 阅读更多 →

日新闻

AI Agent白手起家26: 使用标准事件驱动大模型实践

AI Agent白手起家26: 使用标准事件驱动大模型实践

纲要 练习目标:掌握大模型标准事件的调用回顾 LangChain 中的核心标准事件 invokestreambatchastream_eventswith_structured_output 环境准备实战代码:多种事件调用对比 同步调用与流式输出批量处理异步事件流监听结构化输出 运行说明与预期结果总结与扩…

2026/8/4 0:00:40 阅读更多 →
dealsea是什么?跨境卖家必知的美国deal站入门指南

dealsea是什么?跨境卖家必知的美国deal站入门指南

说实话,第一次听说美国这个老牌折扣网站的跨境卖家,十个有八个会问同一个问题:这个平台到底是干嘛的?我见过一个做家居出口的朋友,他在亚马逊上月销二十万美金,却从来没用过它。我给他看了首页——一屏一屏…

2026/8/4 0:01:40 阅读更多 →
清华大学重磅EST:植物自导电闪蒸焦耳热600°C/2600°C两步法!稀土超积累植物秒级转化为CeO₂-石墨烯电催化剂!

清华大学重磅EST:植物自导电闪蒸焦耳热600°C/2600°C两步法!稀土超积累植物秒级转化为CeO₂-石墨烯电催化剂!

通讯作者:邓兵、刘建国通讯单位:清华大学DOI:https://doi.org/10.1021/acs.est.6c00603研究背景稀土元素(REEs)是清洁能源技术与电子器件不可或缺的核心原料,然而传统提取方式依赖能耗高、排放大的采矿与强…

2026/8/4 0:01:40 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/3 4:58:13 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/4 11:41:39 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/4 5:26:40 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/3 13:07:03 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/4 11:09:16 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/3 8:27:36 阅读更多 →