题目链接:力扣
解题思路:遍历单词数组,确定每一行的单词数量, 之后就可以得到每一个需要补充的空格数量。从而得到单词之间需要补充的空格数量。具体算法如下:
- 确定每一行的单词数量
- 初始值:
- 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;}
}