import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param words string字符串一维数组
* @param maxWidth int整型
* @return string字符串一维数组
*/
public String[] arrangeWords (String[] words, int maxWidth) {
// write code here
List<String> result = new ArrayList<>();
int i = 0;
while (i < words.length) {
int j = i;
int curWidth = words[j].length();
j++;
while (j < words.length && curWidth + words[j].length() + (j - i) <= maxWidth) {
curWidth += words[j].length();
j++;
}
int totalSpaces = maxWidth - curWidth;
int numWords = j - i - 1;
StringBuilder line = new StringBuilder(words[i]);
if (j < words.length) {
for (int k = i + 1; k < j; k++) {
int numSpaces = (j - k == 1 ||
j == words.length) ? 1 : (totalSpaces + j - k - 2) / (j - k - 1);
line.append(repeatChar(' ', numSpaces));
totalSpaces -= (numSpaces - 1);
line.append(words[k]);
}
if (line.length() < maxWidth) {
line.append(repeatChar(' ', maxWidth - line.length()));
}
} else {
for (int k = i + 1; k < j; k++) {
line.append(" ");
line.append(words[k]);
}
line.append(repeatChar(' ', totalSpaces));
}
result.add(line.toString());
i = j;
}
return result.toArray(new String[0]);
}
private String repeatChar(char c, int count) {
StringBuilder result = new StringBuilder();
for (int i = 0; i < count; i++) {
result.append(c);
}
return result.toString();
}
}
Java
这道题目考察了贪心算法和字符串处理的能力,
主要是将给定的单词列表按照规定的最大行宽进行排列,并保持每行的单词之间间隔尽可能均匀。
代码的文字解释如下:
- 创建一个空的字符串列表 result 以保存最终的排列结果。定义一个整数变量 i 并初始化为 0,用于追踪当前处理的单词索引。
- 进入主循环,用于遍历单词列表。在循环内部,定义整数变量 j 和 curWidth,其中 j 表示当前行的单词结束索引,curWidth 表示当前行中所有单词的总宽度。
- 在内层循环中,通过计算当前行的宽度,判断是否还能容纳更多的单词。如果可以,将 curWidth 增加下一个单词的长度,并将 j 增加 1。
- 计算当前行剩余的空格数,即 maxWidth 减去 curWidth。计算还未放置的单词数量,即 numWords。
- 创建一个 StringBuilder 对象 line,将当前行的第一个单词添加进去。
- 根据情况,分两种情况处理:a. 如果当前行不是最后一行,即 j < words.length:在一个循环中,从当前行的下一个单词开始遍历到最后一个单词。计算单词之间的平均空格数 avgSpaces,以及额外的空格数 extraSpaces。根据平均空格数和额外空格数,计算每个单词之间的实际空格数,并将其添加到 line 中。如果 line 的长度仍然小于 maxWidth,在行末补充额外的空格。b. 如果当前行是最后一行,即 j == words.length:在一个循环中,将当前行的下一个单词逐个添加到 line 中,每个单词之间用一个空格分隔。在行末补充剩余的空格,使得 line 的长度达到 maxWidth。
- 将当前行的内容 line 添加到结果列表 result 中。
- 将索引 i 更新为 j,以便继续处理下一行。
- 在主循环结束后,将 result 转换为字符串数组并返回。
- 实现了一个辅助方法 repeatChar,用于重复生成一个指定字符多次。

京公网安备 11010502036488号