题目描述:
示例 1:
示例 2:
示例 3:
题目分析:
- 一行只有一个单词word, 剩余空格数 len = maxWidth - word.length;填充到右边。
- 一行有多个单词,假设单词数量为num,则存在num - 1个间隔需要maxWidth - num个单词的长度,需要一次填充到单词的间隔中
- 最后一行,单词之间的间隔占据一个空格,剩下的空格全部填充到右边
思路:
代码实现:
class Solution {
public List<String> result = new ArrayList();
public String[] arr;
public int maxWidth;
public List<String> fullJustify(String[] words, int maxWidth_) {
maxWidth = maxWidth_;
arr = words;
int count = 0;
int len = words.length;
int left = 0, right = 0;
while (right < len) {
count += words[right].length(); // 计算单词长度.
count++; // 加上空格
if ((count - 1)> maxWidth) { // 可以写一行
count -= words[right].length();
right--; //上一次单词才是该行最后一个单词
if (left == right) { // 如果一行只有一个单词
oneWord(left);
} else if (left < right) { // 如果一行有多个单词.
manyWord(left, right, count - 2);
}
left = right + 1;
count = 0;
}
right++;
}
lastWord(left, len - 1, count - 1);
return result;
}
public void oneWord(int left) { // 一个单词一行.
StringBuilder sb = new StringBuilder();
sb.append(arr[left]);
int len = arr[left].length();
while (len++ < maxWidth) {
sb.append(" ");
}
result.add(sb.toString());
}
public void manyWord(int left, int right, int count) {
int wordNum = right - left + 1; // 单词数量.
int[] nums = new int[wordNum - 1];
int len = maxWidth - count + wordNum - 1; // 空格数量.
int idx = 0;
while (len-- > 0) {
nums[idx]++;
idx++;
idx %= nums.length;
}
idx = 0;
StringBuilder sb = new StringBuilder();
while (left <= right) {
sb.append(arr[left++]);
if (idx < nums.length) {
int num = nums[idx++];
for (int j = 0; j < num; j++) {
sb.append(" ");
}
}
}
result.add(sb.toString());
}
public void lastWord(int left, int right, int count) {
StringBuilder sb = new StringBuilder();
while (left < right) {
sb.append(arr[left++]).append(" ");
}
sb.append(arr[right]);
while (count++ < maxWidth) {
sb.append(" ");
}
result.add(sb.toString());
}
}