纯实现题,不难,每一步要求逻辑清晰
public List<String> fullJustify(String[] words, int maxWidth) {
List<String> res = new ArrayList<>();
if (words == null || words.length == 0) return res;
// 在words数组里的指针
int index = 0;
while (index < words.length) {
int count = words[index].length(); //当前单词长度
int last = index + 1; //下一个单词
while (last < words.length) {
if (words[last].length() + count + 1 > maxWidth) break;
count += words[last].length() + 1;
last++;
}
//===================== 以上代码确定了每一行有多少个单词===========================
StringBuilder sb = new StringBuilder();
int diff = last - index - 1;
//=====================分两种情况讨论==============================
// if last line or number of words in the line is 1, left-justified
if (last == words.length || diff == 0) {
for (int i = index; i < last; i++) {
sb.append(words[i] + " ");
}
sb.deleteCharAt(sb.length() - 1);
for (int i = sb.length(); i < maxWidth; i++) {
sb.append(" ");
}
} else {
// middle justified
int space = (maxWidth - count) / diff; //每个单词中间至少有几个空格
int r = (maxWidth - count) % diff; // 除了至少的空格,又多了几个空格
for (int i = index; i < last; i++) {
sb.append(words[i]);
if (i < last - 1) {
for (int j = 0; j <= (space + ((i - index) < r ? 1 : 0)); j++) {
sb.append(" ");
}
}
}
}
res.add(sb.toString());
index = last; //不能忘啦,否则无限循环
}
return res;
}