Input:
words = ["This", "is", "an", "example", "of", "text", "justification."]
maxWidth = 16
Output:
[
"This is an",
"example of text",
"justification. "
]
复制代码
eg2:前端
Input:
words = ["What","must","be","acknowledgment","shall","be"]
maxWidth = 16
Output:
[
"What must be",
"acknowledgment ",
"shall be "
]
复制代码
题目分析: 由于每一行最大字符数为target,所以,每一一行中words[i]的字符长度总数之和必须小于target,且每一个words[i]之间须要至少一个空格。所以假设咱们第一行中有m项,各项字符总数为count,那么咱们count必须小于等于target - m + 1; 经过对words数组进行循环,计算出每一行的组成项,而后在每项之间使用相应适量的空格进行连接。可是有两点须要特殊处理,1.某一行只有一项,这种状况直接在该项后面加上相应数量的空格,2.最后一行,数组项之间采用单个空格连接,剩余空格添加在最后。算法
具体算法以下:数组
const fullJustify = function(words, maxWidth) {
let str = []; //最终返回数组
let strArr = []; //每一行数组项数组
let diff = maxWidth; //当前行数剩余字符数量
let total = 0; //每一行各项数组字符长度之和
for (let item of words) {
const len = item.length; //当前数组项字符长度
if (len <= diff) { //若是当前字符数量小于diff,则存入strArr,并更新diff
total += len;
strArr.push(item);
diff -= len + 1;
} else {
diff = maxWidth - total; //须要添加的空格数量
if (strArr.length <= 1) { //处理只有一项的特殊状况
strArr[0] += ' '.repeat(diff);
} else {
while (diff > 0) { //为每一行的数组前strArr.length - 1项添加空格
for (let i = 0; i < strArr.length; i++) {
if (diff > 0 && i < strArr.length - 1) {
strArr[i] = strArr[i] + ' ';
diff -= 1;
}
}
}
}
str.push(strArr.reduce((a, b) => a + b));
strArr = [item];
total = len;
diff = maxWidth - len - 1;
}
}
// 处理最后一行
diff = maxWidth - total - strArr.length + 1;
str.push(strArr.join(' ') + ' '.repeat(diff));
return str;
};
复制代码
解题思路大体如上,固然还有不少更好的写法,总体来讲上述算法在运行耗时上表现不够优秀,能够考虑以空间换时间,再次我也只是抛砖引玉!bash