leetcode
leetcode 1451 ~ 1500
重新排列单词间的空格

重新排列单词间的空格

难度:

标签:

题目描述

代码结果

运行时间: 26 ms, 内存: 0.0 MB


/*
 * 思路:
 * 1. 统计字符串中的空格总数。
 * 2. 使用空格将字符串分割成单词列表。
 * 3. 计算每对相邻单词之间应分配的空格数,以及剩余的空格数。
 * 4. 使用Java Stream API重新排列空格,将每对相邻单词之间分配相同数量的空格,将剩余空格放在末尾。
 */
import java.util.Arrays;
import java.util.stream.Collectors;

public class Solution {
    public String reorderSpaces(String text) {
        long totalSpaces = text.chars().filter(c -> c == ' ').count();
        String[] words = Arrays.stream(text.trim().split("\\s+")).toArray(String[]::new);
        int wordCount = words.length;
        if (wordCount == 1) {
            return words[0] + " ".repeat((int)totalSpaces);
        }
        long spacesBetweenWords = totalSpaces / (wordCount - 1);
        long extraSpaces = totalSpaces % (wordCount - 1);
        String spaceBetween = " ".repeat((int)spacesBetweenWords);
        return Arrays.stream(words).collect(Collectors.joining(spaceBetween)) + " ".repeat((int)extraSpaces);
    }
}

解释

方法:

该题解首先通过 strip 去除原字符串两端的空格并分割成单词列表。然后计算总空格数,通过总长度减去所有单词长度之和得到。如果单词数量大于1,计算相邻单词间的平均空格数,并确定末尾的剩余空格数。使用 join 结合这些空格重新组合单词。如果只有一个单词,直接将所有空格放在单词后面。

时间复杂度:

O(n)

空间复杂度:

O(n)

代码细节讲解

🦆
在通过strip()和split()处理text时,如何确保所有单词之间多余的空格被正确计算并用于后续空格分配?
在处理字符串时,`strip()`方法用于去除字符串首尾的空格,而`split()`默认将字符串分割成单词列表,同时会去除单词间的所有多余空格。这意味着,无论单词间原本有多少空格,`split()`都会将它们视为单个分隔符。因此,通过原始字符串长度减去去空格后单词列表中所有单词的总长度,我们可以得到原字符串中所有的空格数,包括单词间的多余空格。这个空格总数随后用于在单词间重新分配。
🦆
为什么在单词数量大于1时,需要计算单词间的平均空格数而不是直接分配所有空格?这样的设计有什么特定的考虑吗?
当单词数量大于1时,计算每对相邻单词间的平均空格数是为了保证文本的均匀排版。这种设计确保了文本中的空格被平均分配,从而使得整个字符串看起来更为整齐和专业。如果不按平均数分配,而是随意分配空格,可能会导致文本看起来不均匀,影响美观和可读性。
🦆
当单词数量为1时,所有空格都被放置在单词后面,这种处理方式是否最优,还有没有其他可能的空格分配方式?
将所有空格放在单词后面是一种简单且清晰的处理方式,尤其是在文本格式化或对齐的场景下。然而,这不一定是最优的处理方式。其他可能的空格分配方式包括将空格平均分布在单词前后或者根据某种规则(如文本对齐需求)调整空格位置。例如,在某些文本编辑场景中,可能需要将单词居中或右对齐,这时空格的分配就需要相应调整。
🦆
在计算末尾空格数时,为什么使用了spaceNumSum减去乘积的计算方式?这种计算方式是否可能因为整数除法的取整误差导致错误?
在计算末尾空格数时,使用`spaceNumSum`减去乘积的方式是为了确保所有空格都被正确地分配。这种方法是基于整数除法的结果进行的计算,整数除法会向下取整,因此乘积部分计算的是除了末尾空格之外的已经均匀分配的空格总数。由于向下取整可能导致最终的空格数少于原始总空格数,所以需要通过减法来计算剩余的末尾空格。这种计算方式确保了空格的完整分配,没有误差。

相关问题