首页 > 其他分享 >LeetCode题练习与总结:反转字符串中的单词 Ⅲ -- 557

LeetCode题练习与总结:反转字符串中的单词 Ⅲ -- 557

时间:2025-01-18 23:32:17浏览次数:3  
标签:空格 数组 -- StringBuilder 557 单词 复杂度 字符串 LeetCode

一、题目描述

给定一个字符串 s ,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。

示例 1:

输入:s = "Let's take LeetCode contest"
输出:"s'teL ekat edoCteeL tsetnoc"

示例 2:

输入: s = "Mr Ding"
输出:"rM gniD"

提示:

  • 1 <= s.length <= 5 * 10^4
  • s 包含可打印的 ASCII 字符。
  • s 不包含任何开头或结尾空格。
  • s 里 至少 有一个词。
  • s 中的所有单词都用一个空格隔开。

二、解题思路

  1. 首先我们需要将字符串按照空格分割成单词数组。
  2. 然后遍历这个数组,将每个单词进行反转。
  3. 最后,我们将反转后的单词数组重新拼接成字符串,单词之间用空格分隔。

三、具体代码

class Solution {
    public String reverseWords(String s) {
        // 将字符串按空格分割成单词数组
        String[] words = s.split(" ");
        // 创建一个StringBuilder对象用于拼接反转后的单词
        StringBuilder reversedString = new StringBuilder();
        
        // 遍历单词数组
        for (String word : words) {
            // 反转当前单词
            String reversedWord = new StringBuilder(word).reverse().toString();
            // 将反转后的单词添加到StringBuilder对象中,并在单词后添加一个空格
            reversedString.append(reversedWord).append(" ");
        }
        
        // 删除最后一个多余的空格,并转换为字符串
        return reversedString.toString().trim();
    }
}

在这段代码中,我们首先使用split(" ")方法将输入字符串s按空格分割成单词数组。然后,我们使用StringBuilderreverse()方法来反转每个单词,并将反转后的单词添加到StringBuilder对象reversedString中,每个单词后面添加一个空格。最后,我们使用trim()方法来删除最后一个多余的空格,并返回最终的字符串。

四、时间复杂度和空间复杂度

1. 时间复杂度
  • split(" ") 方法:这个方法会遍历整个字符串一次,因此时间复杂度是 O(n),其中 n 是字符串的长度。
  • StringBuilder(word).reverse():对于每个单词,我们调用 reverse() 方法,该方法会遍历单词中的每个字符一次。假设最坏情况下,每个单词的长度接近 n,则这部分的时间复杂度是 O(n)。
  • 循环遍历单词数组:假设有 k 个单词,那么循环的时间复杂度是 O(k)。
  • toString() 和 trim() 方法:这些方法的时间复杂度都是 O(n),因为它们需要遍历整个字符串。

综上所述,总的时间复杂度是 O(n) + O(n * k) + O(k) + O(n),简化后是 O(n * k),因为 n * k 是最大的项。由于每个单词的平均长度是 n/k,所以可以近似为 O(n)。

2. 空间复杂度
  • words 数组:这个数组存储了所有的单词,最坏情况下,如果每个字符都是单词,那么数组的大小将是 O(n)。
  • StringBuilder 对象:这个对象在拼接反转后的单词时,会存储整个反转后的字符串,因此空间复杂度是 O(n)。

综上所述,总的空间复杂度是 O(n) + O(n),简化后是 O(n)。

五、总结知识点

  • 字符串分割

    • 使用 String.split(" ") 方法将字符串按照空格分割成单词数组。这个方法基于正则表达式,此处使用空格字符作为分隔符。
  • StringBuilder 类

    • StringBuilder 类用于构建可变字符串,它的实例可以动态地改变内容,适用于频繁修改字符串的场景。
    • 使用 new StringBuilder() 创建 StringBuilder 对象。
    • 使用 append() 方法向 StringBuilder 对象中添加字符串。
    • 使用 reverse() 方法反转 StringBuilder 对象中的字符顺序。
    • 使用 toString() 方法将 StringBuilder 对象转换为 String 对象。
  • 增强型 for 循环

    • 使用增强型 for 循环(for-each 循环)来遍历数组 words。这种循环简化了遍历数组和集合的语法。
  • 字符串方法

    • 使用 trim() 方法来删除字符串开头和结尾的空白字符。在本例中,它用于删除拼接单词后 StringBuilder 对象末尾的额外空格。
  • 字符串与 StringBuilder 的转换

    • 在代码中,StringBuilder 被用来反转单词,然后通过 toString() 方法转换为 String 类型。
  • 数组的使用

    • 代码中使用数组 String[] words 来存储分割后的单词。
  • 字符串连接

    • 在循环中,通过 append() 方法将反转后的单词和空格连接起来,构建最终的字符串。
  • 字符串的不可变性

    • 代码展示了字符串的不可变性。在 Java 中,字符串对象一旦创建,其内容不可更改。因此,需要使用 StringBuilder 来进行字符串的反转操作。

以上就是解决这个问题的详细步骤,希望能够为各位提供启发和帮助。

标签:空格,数组,--,StringBuilder,557,单词,复杂度,字符串,LeetCode
From: https://blog.csdn.net/weixin_62860386/article/details/145216266

相关文章

  • 再学欧拉之欧拉定理
    没错,本文的一切还是为了它——\(\varphi\)。欧拉定理内容若\(a,n\)互质,则有\(a^{\varphi(n)}\equiv1\pmodn\)。证明设小于\(n\)且与\(n\)互质的自然数集合(即\(n\)的剩余系)为:\(X:x_1,x_2,x_3,\dots,x_{\varphi(n)},P:p_1=a\timesx_1,p_2=a\timesx_2,\dots,p_......
  • PTA:一维数组 简化的插入排序
    本题要求编写程序,将一个给定的整数插到原本有序的整数序列中,使结果序列仍然有序。输入格式:输入在第一行先给出非负整数N(<10);第二行给出N个从小到大排好顺序的整数;第三行给出一个整数X。输出格式:在一行内输出将X插入后仍然从小到大有序的整数序列,每个数字后面有一个空格。输......
  • 一站式解决PDF文档的日常处理需求
    PDF24工具箱是一个功能全面且操作简便的PDF处理平台,为用户提供了一系列高效的文档处理服务。从创建、编辑到转换PDF文件,PDF24都能轻松应对。这个平台适合各类用户群体,包括学生、教师、职场人士以及自由职业者,且大部分功能均可免费使用。创建PDF文件当您需要将Word文档、图......
  • 518. 零钱兑换 II
    518.零钱兑换II给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。假设每一种面额的硬币有无限个。 题目数据保证结果符合32位带符号整数。示......
  • 深入HDFS——数据上传源码
    引入就如RPC篇章里提到的观点一样,任何一种能广为传播的技术,都是通过抽象和封装的思想,屏蔽底层底层复杂实现,提供简单且强大的工具,来降低使用门槛的。HDFS的风靡自然也是如此。通过前面深入了NameNode和DataNode的启动源码,我们已经是略有体会,但重启毕竟属于工作时几乎遇不到的......
  • MESED: A Multi-modal Entity Set Expansion Dataset with Fine-grained Semantic Cla
    MESED:AMulti-modalEntitySetExpansionDatasetwithFine-grainedSemanticClassesandHardNegativeEntities译文论文题目:MESED:AMulti-modalEntitySetExpansionDatasetwithFine-grainedSemanticClassesandHardNegativeEntities论文链接:https://ar......
  • 【JavaEE进阶】SpringMVC 响应
    目录......
  • 【LLM】Openai-o1及o1类复现方法
    note可以从更为本质的方案出发,通过分析强化学习的方法,看看如何实现o1,但其中的核心就是在于,如何有效地初始化策略、设计奖励函数、实现高效的搜索算法以及利用强化学习进行学习和优化。文章目录note一、Imitate,Explore,andSelf-Improve:AReproductionReportonS......
  • Redis 入门教程:什么是 Redis?如何开始使用?
    Redis入门教程:什么是Redis?如何开始使用?Redis是一个开源的内存数据结构存储系统,广泛用于缓存、消息队列、实时数据处理等场景。它不仅速度快,而且支持多种数据结构(如字符串、哈希、列表、集合等),因此非常适合处理大量实时数据。今天,我们将带你一起快速了解Redis,并教你如何上......
  • Redis 深度解析:从基础到进阶,全面掌握高效缓存技术
    Redis深度解析:从基础到进阶,全面掌握高效缓存技术引言:Redis作为现代开发中不可或缺的技术之一Redis(RemoteDictionaryServer)作为一种开源的高性能键值数据库,在实际开发中发挥着至关重要的作用。它以其极高的读写性能、丰富的数据结构、持久化机制以及支持多种编程语言的客......