重新排列单词间的空格
难度:
标签:
题目描述
代码结果
运行时间: 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时,如何确保所有单词之间多余的空格被正确计算并用于后续空格分配?
▷🦆
为什么在单词数量大于1时,需要计算单词间的平均空格数而不是直接分配所有空格?这样的设计有什么特定的考虑吗?
▷🦆
当单词数量为1时,所有空格都被放置在单词后面,这种处理方式是否最优,还有没有其他可能的空格分配方式?
▷🦆
在计算末尾空格数时,为什么使用了spaceNumSum减去乘积的计算方式?这种计算方式是否可能因为整数除法的取整误差导致错误?
▷