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

每日算法练习:LeetCode 151. 反转字符串中的单词 ✅

大家好,我是你们的算法小伙伴。今天我们来练习一道字符串处理的经典中等题 ——LeetCode 151. 反转字符串中的单词。这道题考察对空格和单词边界的处理,是面试中高频的字符串操作题。


题目描述

给你一个字符串s,请你反转字符串中单词的顺序

单词是由非空格字符组成的字符串。s中使用至少一个空格将单词分隔开。

返回单词顺序颠倒且单词之间用单个空格连接的结果字符串。

注意:输入字符串s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。

示例 1:

输入:s = "the sky is blue" 输出:"blue is sky the"

示例 2:

输入:s = " hello world " 输出:"world hello" 解释:反转后的字符串中不能存在前导空格和尾随空格。

示例 3:

输入:s = "a good example" 输出:"example good a" 解释:如果两个单词间有多余的空格,反转后的字符串需要将单词间的空格减少到仅有一个。

解题思路

核心思路:拆分 → 反转 → 拼接

  1. 拆分单词:将原字符串按空格分割,自动过滤掉空字符串(处理多余空格)。
  2. 反转单词顺序:将拆分得到的单词列表逆序排列。
  3. 重新拼接:用单个空格将逆序后的单词列表拼接成结果字符串。

这种方法在 Java 中实现简洁,且能自动处理所有空格问题。


代码实现

class Solution { public String reverseWords(String s) { // 1. 按空格分割字符串,自动过滤空字符串(处理多余空格) String[] words = s.trim().split("\\s+"); // 2. 反转单词顺序 StringBuilder sb = new StringBuilder(); for (int i = words.length - 1; i >= 0; i--) { sb.append(words[i]); // 最后一个单词后不加空格 if (i != 0) { sb.append(" "); } } return sb.toString(); } }

代码详解(结合示例 2 模拟)

示例 2:s = " hello world "

  1. s.trim():去除首尾空格 →"hello world"
  2. .split("\\s+"):按一个或多个空格分割,得到单词数组 →["hello", "world"]
  3. 逆序拼接
    • 先加"world",再加空格
    • 再加"hello",不加空格
    • 结果 →"world hello",与示例一致

进阶:原地解法(O (1) 额外空间,Java 需转成字符数组)

class Solution { public String reverseWords(String s) { char[] chars = s.toCharArray(); int n = chars.length; // 1. 反转整个字符串 reverse(chars, 0, n - 1); // 2. 反转每个单词 int start = 0; for (int i = 0; i < n; i++) { if (chars[i] == ' ') { reverse(chars, start, i - 1); start = i + 1; } } // 反转最后一个单词 reverse(chars, start, n - 1); // 3. 清理多余空格 StringBuilder sb = new StringBuilder(); for (char c : chars) { if (c != ' ') { sb.append(c); } else if (!sb.isEmpty() && sb.charAt(sb.length() - 1) != ' ') { sb.append(' '); } } // 去除末尾可能的空格 if (!sb.isEmpty() && sb.charAt(sb.length() - 1) == ' ') { sb.deleteCharAt(sb.length() - 1); } return sb.toString(); } // 辅助函数:反转字符数组的 [l, r] 区间 private void reverse(char[] chars, int l, int r) { while (l < r) { char temp = chars[l]; chars[l] = chars[r]; chars[r] = temp; l++; r--; } } }

复杂度分析

方法时间复杂度空间复杂度
拆分反转拼接O(n)O (n)(存储单词数组)
原地解法O(n)O (1)(仅使用常数级额外空间)

总结

  1. 核心技巧:利用split("\\s+")自动处理多余空格,再逆序拼接,代码简洁高效。
  2. 进阶思路:原地反转整个字符串后再逐个反转单词,实现 O (1) 额外空间,适合面试时展示更优的算法思维。
  3. 边界处理:自动处理前导、尾随、单词间多余空格,保证结果字符串格式正确。

这道题是字符串处理的经典题,掌握这两种思路,就能轻松解决这类单词反转和空格清理的问题。

今天的每日算法练习就到这里,我们明天再见!👋

http://www.jsqmd.com/news/555586/

相关文章:

  • 刘海空间再造:NotchDrop如何将MacBook摄像头区域转化为高效文件中转站
  • Anaconda误删急救指南:30分钟极速恢复
  • 虚拟细胞界爱马仕?
  • 13 docker具体解决的问题
  • 为什么你的VS2017总是登录失败?深入解析凭证刷新与Edge浏览器的隐藏关联
  • 多维对比:2026 年主流 AI 证书的含金量权重与选择策略
  • 终极指南:如何用 embyToLocalPlayer 打造专业级本地播放体验
  • detailed-docx:一个能保住格式的 Word 文档操作库
  • Blackbox跨环境部署与版本迁移完全指南:从问题排查到落地实践
  • 20254202 2025-2026-2 《Python程序设计》实验1报告
  • Kotlin的Socket连接与UDP广播和接收
  • 跨平台虚拟机自动化控制:从繁琐操作到一键部署的效率革命
  • 终极指南:3分钟掌握QMK Toolbox键盘固件刷写技巧
  • 为什么92%的工业网关Python配置在上线72小时内崩溃?——基于37个真实产线案例的配置健壮性白皮书
  • Mac Mouse Fix技术架构深度解析:从Objective-C到Swift的混合架构演进
  • MQTT遗嘱消息实战:如何用LWT+保留消息打造智能家居设备离线预警系统
  • WhisperLive:高性能实时语音转文本架构解析与多引擎优化方案
  • 3种PostHog部署模式:为不同规模团队定制的数据分析平台搭建指南
  • 华三M-LAG实战:从零构建高可用数据中心网络
  • OpenClaw异常处理大全:nanobot任务失败自救指南
  • Agnet
  • foobox-cn:让foobar2000音乐播放体验提升300%的开源界面增强工具
  • springboot-vue基于web的小说在线阅读平台
  • springboot-vue基于web的智慧党建平台设计与实现
  • 微信小游戏过审实战:JS混淆与马甲包规避技巧
  • Pixel Dream Workshop参数详解:CFG/Steps/Scale三维度精准控制像素粒度
  • 3个技巧让LibreTranslate翻译模型部署速度提升80%
  • 中西医结合内科主治备考,找对机构才靠谱 - 医考机构品牌测评专家
  • 模拟IC设计中的‘效率’权衡:深入理解gm/ID如何平衡增益、带宽与噪声
  • 别只当摆设!深度挖掘Kylin V10 SP1安全中心的‘应用保护’与‘设备安全’实战用法