leetcode
leetcode 2601 ~ 2650
字符串中的单词反转

字符串中的单词反转

难度:

标签:

题目描述

English description is not available for the problem. Please switch to Chinese.

代码结果

运行时间: 64 ms, 内存: 15.2 MB


/*
  思路:
  1. 使用Java Stream来处理字符串的操作。
  2. 去掉首尾空格,并按空格分割字符串为流。
  3. 反转流中的单词顺序。
  4. 使用Collectors.joining来连接单词并返回结果。
*/
import java.util.stream.Collectors;
import java.util.Arrays;

public class Solution {
    public String reverseWords(String message) {
        // 使用Stream处理字符串
        return Arrays.stream(message.trim().split(" +"))
                     .sorted((a, b) -> -1)
                     .collect(Collectors.joining(" "));
    }
}

解释

方法:

该题解通过遍历输入字符串,从右到左寻找单词,并逐个添加到结果列表中。首先,使用 strip() 方法去除输入字符串的首尾空格。然后,使用两个指针 i 和 j,初始都指向字符串的最后一个字符。指针 i 向左移动直到找到一个空格,表示一个单词的结束,然后将这个单词添加到结果列表中。接着,跳过中间的所有空格,继续寻找下一个单词。这个过程重复进行,直到遍历完整个字符串。最后,使用 join() 方法将列表中的单词用单个空格连接起来,形成最终的反转后的字符串。

时间复杂度:

O(n)

空间复杂度:

O(n)

代码细节讲解

🦆
在解题过程中,为何选择从右向左而不是从左向右遍历字符串?这样做的优势是什么?
从右向左遍历字符串的主要优势是方便在添加单词到结果列表时实现单词的反转。当从右向左遍历时,我们可以直接按照单词出现的顺序添加到结果列表,而这些单词在最终的输出字符串中将自然地呈现为反转的顺序。如果从左向右遍历,则每次找到一个单词后,需要将其插入到结果列表的开头,这在某些编程语言中可能导致较低的效率,因为插入操作可能涉及数组元素的频繁移动。
🦆
你是如何确保在处理具有多个空格的字符串时,结果中单词间只有一个空格的?
在提供的算法中,通过在找到每个单词后使用一个循环来跳过所有连续的空格,确保了下一个单词的搜索从非空格字符开始。这意味着结果列表中添加的每个单词之间原本存在的多余空格都被忽略。最终使用 `join()` 方法连接列表中的单词时,`join()` 自动在每个单词间插入一个单个空格,从而保证了单词之间的分隔恰好只有一个空格,无论原字符串中单词间有多少空格。
🦆
能否详细解释`while i >= 0 and s[i] != ' '`循环的作用及其如何确定单词的边界?
这个循环的目的是向左移动指针i,直到找到一个空格字符,这标志着当前单词的开始(左边界)。在这个过程中,指针j保持不变,指向当前单词的结束(右边界)。因此,当循环结束时,i和j之间的部分就是一个完整的单词。这个循环确保了即使单词之间有多个空格,也能准确识别并提取每个单词。
🦆
为什么需要在找到一个单词后,再使用一个循环来跳过所有空格,这是否意味着算法效率受到空格数量的影响?
是的,这个设计确实意味着算法效率在一定程度上受到输入字符串中空格数量的影响。这个额外的循环用于跳过单词间的所有空格,以确保下一次迭代能够正确开始于新单词的末尾。如果字符串中空格很多,特别是在单词之间,这将导致额外的迭代和时间消耗。然而,对于大多数实际应用,这种效率的影响通常是可接受的,尤其是考虑到代码的可读性和直观性。

相关问题