竖直打印单词
难度:
标签:
题目描述
代码结果
运行时间: 20 ms, 内存: 15.9 MB
/**
* 思路:
* 1. 通过流的方式将输入字符串按空格分割成单词数组。
* 2. 计算最长单词的长度。
* 3. 使用流创建每一列的字符串,同时使用StringBuilder构建并通过map和collect收集结果。
* 4. 使用map操作去除末尾的空格。
*/
import java.util.stream.Collectors;
import java.util.stream.IntStream;
import java.util.List;
import java.util.Arrays;
public List<String> printVerticallyStream(String s) {
// 分割字符串成单词数组
String[] words = s.split(" ");
// 计算最长单词的长度
int maxLength = Arrays.stream(words).mapToInt(String::length).max().orElse(0);
// 创建结果列表
return IntStream.range(0, maxLength)
.mapToObj(i -> Arrays.stream(words)
.map(word -> i < word.length() ? String.valueOf(word.charAt(i)) : " ")
.collect(Collectors.joining()))
.map(str -> str.replaceAll("\\s+$", ""))
.collect(Collectors.toList());
}
解释
方法:
题解的核心思想是先将输入字符串s按空格分割成单词列表,然后找出最长单词的长度。这一长度决定了输出列表中字符串的数量,即最终结果的高度。接着,对于每一个可能的字符位置(从0开始,直到最长单词的长度),从每个单词中尝试取出对应位置的字符,若当前单词长度不足,则用空格代替。这样,我们可以构建出每一列的字符串。由于输出不允许有尾随空格,因此每构建完一列后,需要对其进行右侧空格的剪裁。
时间复杂度:
O(n + m*k)
空间复杂度:
O(m*k)
代码细节讲解
🦆
在题解中,为什么在处理每列的字符时选择使用列表推导式和条件表达式,而不是其他循环或条件结构?
▷🦆
题解提到最终结果要剪裁右侧空格,具体是如何确定每列字符串中的尾随空格数量的?
▷🦆
你是如何保证每个单词只在一列上打印,并且列之间不会相互影响的?
▷🦆
输出的每一列字符串是如何处理和保证没有尾随空格的?
▷