这道题好繁琐啊,我的思路是一个一个单词判断,每一个都加上两个单词之间的空格去看长度是否超过maxWidth,如果超过了,进行判断,只有一个单词或者到了最后一行,直接左对齐,后面填充空格,超过一个单词,进行计算每个单词之间的空格的个数,进行填充,一个一个累加,最后加入最终的结果列表。
但是真的一个不小心就容易写错......
68. 文本左右对齐
题目:



题解:
java
class Solution {
public List<String> fullJustify(String[] words, int maxWidth) {
List<String> result = new ArrayList<>();
int n = words.length;
int i = 0;
while (i < n) {
// 1. 找出当前行能放哪些单词 [i, j)
int j = i;
int lineLength = 0; // 只算单词长度,不算空格
while (j < n && lineLength + words[j].length() + (j - i) <= maxWidth) {
lineLength += words[j].length();
j++;
}
// 2. 处理这一行
int wordCount = j - i;
int spaces = maxWidth - lineLength; // 总共要填充的空格数
StringBuilder line = new StringBuilder();
if (j == n || wordCount == 1) {
// 最后一行 或 只有一个单词:左对齐
for (int k = i; k < j; k++) {
line.append(words[k]);
if (k < j - 1) line.append(" ");
}
// 末尾补空格
while (line.length() < maxWidth) {
line.append(" ");
}
} else {
// 中间行:两端对齐
int avgSpaces = spaces / (wordCount - 1);
int extraSpaces = spaces % (wordCount - 1);
for (int k = i; k < j; k++) {
line.append(words[k]);
if (k < j - 1) {
// 添加基础空格
for (int s = 0; s < avgSpaces; s++) {
line.append(" ");
}
// 前 extraSpaces 个间隙多加一个空格
if (k - i < extraSpaces) {
line.append(" ");
}
}
}
}
result.add(line.toString());
i = j; // 移动到下一行
}
return result;
}
}