老师好,有如下代码报错:
class Solution {
public List<String> fullJustify(String[] words, int maxWidth) {
int left = 0; List<String> result = new ArrayList<>();
// 每一行进行循环和遍历
while (left < words.length) {
//1.找到单词:确定该行应该有的单词个数及左右坐标
int right = findRight(left, words, maxWidth);
//2. 添加空格
result.add(justify(left, right, words, maxWidth));
left = right + 1;
}
return result;
}
//找到当前行最右边的单词下标
private int findRight(int left, String[] words, int maxWidth) {
int right = left;
int sum = words[right++].length();
//while的条件:1,需要有这个单词 2,新加入单词后不越界
//因为题目中说了肯定至少能塞下一个单词,因此不用考虑一个单词越界的问题。
while (right < words.length && (sum + 1 + words[right].length()) <= maxWidth)
sum += 1 + words[right++].length();
return right - 1;
}
//根据不同的情况添加不同的空格
private String justify(int left, int right, String[] words, int maxWidth) {
//1.是最后一行,且只有一个单词的情况
if (right - left == 0) return padResult(words[left], maxWidth);
//2.最后一行,但又多个单词的时候
if (right == words.length - 1) {
//最后一行要求必须是只空一个,即便空两个刚好能填满,也一样。
String space = " ";
StringBuilder result = new StringBuilder();
for (int i = left; i <= right; i++)
result.append(words[i]).append(space);
return padResult(result.toString(), maxWidth);
}else{
// 3. 非最后一行的情况
int numSpaces = right - left;
int totalSpace = maxWidth - wordsLength(left, right, words);
String space = blank(totalSpace / numSpaces);
int remainder = totalSpace % numSpaces;
StringBuilder result = new StringBuilder();
for (int i = left; i <= right; i++) {
result.append(words[i]).append(space)
.append(remainder-- > 0 ? " " : "");
}
return padResult(result.toString().trim(), maxWidth);
}
}
//当前单词的长度
private int wordsLength(int left, int right, String[] words) {
int wordsLength = 0;
for (int i = left; i <= right; i++) wordsLength += words[i].length();
return wordsLength;
}
private String padResult(String result, int maxWidth) {
return result + blank(maxWidth - result.length());
}
private String blank(int length) {
return new String(new char[length]).replace('\0', ' ');
}
}
报错的原因是:越界了
我查看了答案,问题出在53行,没有对sb进行trim,
这里我不懂,根据算法,result只可能再最后出现空格,
即便带着空格,经过
padResult
函数,也会补充对应的空格,所以不懂53行,为什么一定要对result的空格进行删除?谢谢