leetcode
leetcode 1601 ~ 1650
截断句子

截断句子

难度:

标签:

题目描述

代码结果

运行时间: 20 ms, 内存: 15.7 MB


/*
 * 思路:
 * 1. 使用Java Streams将字符串按空格分割成单词流。
 * 2. 限制流的元素个数为k。
 * 3. 将这些元素收集成一个单一的字符串。
 */
import java.util.Arrays;
import java.util.stream.Collectors;

public class Solution {
    public String truncateSentence(String s, int k) {
        // 使用stream流操作来处理字符串
        return Arrays.stream(s.split(" "))
                     .limit(k)
                     .collect(Collectors.joining(" "));
    }
}

解释

方法:

题解的核心思路是通过遍历句子中的每个字符,并在遇到空格时减少计数器 k,因为空格代表一个单词的结束。当 k 减到 0 时,我们知道已经遍历完 k 个单词,所以此时的字符索引即是我们需要截断句子的位置。如果遍历完整个句子后 k 还没有减到 0,说明句子中的单词数不超过 k,因此直接返回整个句子。

时间复杂度:

O(n)

空间复杂度:

O(1)

代码细节讲解

🦆
算法中提到的遍历方法是否能够处理所有含有连续空格的句子,或者这种情况下会有什么影响?
算法在遇到每个空格时减少计数器 k 的值,连续空格会被视为多个单词的结束。这意味着如果句子中有连续空格,算法会错误地将这些空格计算为多个单词的分隔,从而导致提前截断句子。因此,这种算法不能正确处理含有连续空格的情况,除非加入逻辑来忽略连续的空格。
🦆
当句子最后一个单词后存在额外空格时,这个算法是否能正确识别,还是会导致截断错误?
如果句子最后一个单词后存在额外空格,这个算法会将额外的空格视为另一个单词的结束。这可能导致算法不会在最后一个实际单词后立即截断,而是在随后的一个或多个空格处截断。因此,如果截断位置正好位于这些额外空格之前,算法可能无法正确识别,并可能导致错误的输出。
🦆
如果输入整数 k 大于句子中的单词总数,返回整个句子的逻辑是否总是正确,或者在某些特殊情况下可能会出现问题?
如果 k 大于句子中的单词总数,算法的最后一步逻辑是直接返回整个句子,这在大多数情况下是正确的。然而,如果句子包含额外的尾随空格或连续空格,算法会将这些空格误认为单词分隔,从而可能在不恰当的位置结束。因此,在含有多余空格的特殊情况下,返回整个句子可能不符合预期的输出格式。
🦆
代码中的变量 `idx` 初始化为 None,但在循环中没有直接检查是否 `idx` 为 None 以后再赋值,这种做法是否安全,有没有可能引发未预料的行为?
变量 `idx` 初始化为 None 是安全的,因为它是用来存储找到的截断位置的索引。在循环中,只有当找到截断位置(即 k 减到 0 时)才会给 `idx` 赋值。如果循环结束后 `idx` 仍为 None,表示没有找到截断位置,也就是说 k 大于句子中的单词总数,这时直接返回整个句子。这种做法在逻辑上是正确的,不会引发未预料的行为。

相关问题