题目链接:力扣
解题思路:遍历单词数组,确定每一行的单词数量, 之后就可以得到每一个需要补充的空格数量。从而得到单词之间需要补充的空格数量。具体算法如下:
- 确定每一行的单词数量
- 初始值:
- num = 0:单词数量
- realLength=0:这一行单词的长度
- isFinally = false:是否是最后一行
- 如果realLength+num<maxWidth(加上num是因为每一个单词后面至少要有一个空格),则进入循环:
- 如果realLength + num + words[i].length()>maxWidth:退出循环
- realLength +=words[i].length()
- num++;
- 如果i==words.length-1:说明已经是最后一行了,isFinally=true,退出循环
- 初始值:
- 确定需要的空格数量:sum = maxWidth - realLength
- 确定每个单词之间需要的空格数量
- 如果是最后一行:则每个单词之间的空格数量固定为1,最后补充空格到长度为maxWidth
- 如果不是最后一行并且一行只有一个单词:单词左对齐,在最后补充空格
- 不是最后一行,并且有多个单词,则,每个单词之间平均最少需要的空格数量为avg=sum/(num-1),对于不能整数的情况,会剩余prevNum = sum%(num-1)个空格,因为需要将空格均匀分配,并且左边空格数量大于右边空格数量。所以可以将剩余的prevNum个空格依次放在前prevNum个单词之间,即前prevNum单词之间有avg+1个空格,剩下的单词之间有avg个空格
AC代码:
class Solution {
public static List<String> fullJustify(String[] words, int maxWidth) {
List<String> ans = new ArrayList<>();
int pos = 0;
boolean isFinally = false;
while (pos < words.length) {
int num = 0;
int realLength = 0;
for (int i = pos;i<words.length;i++){
if (realLength + num + words[i].length() > maxWidth) {
break;
}
realLength += words[i].length();
num++;
if (i == words.length-1) {
isFinally = true;
break;
}
}
StringBuilder line = new StringBuilder();
//如果是最后一行
if (isFinally) {
//需要补充的空格数量
int blank = maxWidth - (realLength + num-1);
while (num > 0) {
line.append(words[pos]);
if (num != 1) {
line.append(' ');
}
pos++;
num--;
}
while (blank > 0) {
line.append(' ');
blank--;
}
ans.add(line.toString());
return ans;
}
//一共需要sum个空格
int sum = maxWidth - realLength;
//一行只有一个单词
if (num==1){
line.append(words[pos]);
for (int i = 0; i < sum; i++) {
line.append(' ');
}
pos++;
ans.add(line.toString());
continue;
}
//平均每个单词间需要的空格数量
int avg = sum/(num-1);
//前n个单词间需要avg+1个空格
int preNum = sum % (num-1);
for (int i =0;i<num;i++){
line.append(words[pos++]);
if (i!=num-1){
if (i<preNum){
for (int j=0;j<avg+1;j++){
line.append(' ');
}
}else {
for (int j=0;j<avg;j++){
line.append(' ');
}
}
}
}
ans.add(line.toString());
}
return ans;
}
}