1.先取出一行能够容纳的单词,将这些单词根据规则填入一行
2.计算出额外空格的数量 spaceCount,额外空格就是正常书写用不到的空格
2.1除去所有单词的长度
3.平均分布:简单来说就是商和余数的计算
4.特殊处理
4.1一行只有一个单词,单词左对齐,右侧填满空格
4.2最后一行,所有单词左对齐,中间只有一个空格,最后一个单词右侧填满空格
需要填充的空格数量就是词尾空格 + 额外空格,当然最后一个单词的词尾空格不算。具体计算请看下面代码展示。
class Solution {
public List<String> fullJustify(String[] words, int maxWidth) {
List<String> res = new ArrayList<>();
int i = 0;
int n = words.length;
while (i < n) {
// 找到一行可以容下的单词
int left = i;
// 至少一行能放下一个单词
// 注意第一个单词不能 + 1,
// 因为如果只有一个单词,那么不需要加空格,也就不需要 + 1
int cur_row_len = words[i].length();
i++;
while (i < n) {
if (cur_row_len + words[i].length() + 1 > maxWidth) {
break;
}
//这里有空格,所以要 + 1
cur_row_len += words[i].length() + 1;
i++;
}
StringBuilder tmp = new StringBuilder();
// 考虑最后一行
if (i == n) {
for (int j = left; j < i; j++) {
tmp.append(words[j] + " ");
}
//对应特殊处理4.2
//如果最后一个空格正好大于maxWidth,需要删去
tmp.deleteCharAt(tmp.length() - 1);
for (int j = tmp.length(); j < maxWidth; j++) {
tmp.append(" ");
}
res.add(tmp.toString());
break;
}
// 所有单词长度
int all_word_len = 0;
for (int j = left; j < i; j++) {
all_word_len += words[j].length();
}
//System.out.println(all_word_len);
// 至少空格个数,也就是 4个单词,三个空格
int space_num = i - left - 1;
// 需要填充的空格数量
int remain_space = maxWidth - all_word_len;
int a = 0;
int b = 0;
//i不等于n,能放下多个单词,就需要计算空格平均分配
if (space_num != 0) {
a = remain_space / space_num;
b = remain_space % space_num;
}
//空格平均分配
for (int j = left; j < i; j++) {
if (j > left) {
for (int k = 0; k < a; k++) {
tmp.append(" ");
}
if (b != 0) {
tmp.append(" ");
b--;
}
}
tmp.append(words[j]);
}
//i不等于n,而且只能放下一个单词,就需要执行下面语句,因为上面的for循环并没有加入空格
//对应特殊处理4.1
for (int j = tmp.length(); j < maxWidth; j++) {
tmp.append(" ");
}
res.add(tmp.toString());
}
return res;
}
}