版权声明:转载请注明博客地址谢谢。 https://blog.csdn.net/buppt/article/details/81047986
这题164赞538踩。。好惨
就是输入一个字符串数组,数组里每一项是一个单词。再输入一个maxWidth,这个长度是输出每一行的字符串长度。
要求是每个单词和每个单词之间最少一个空格,如果一行最后剩余的位置不能再放一个单词,就把这一行后面的空格平均分到前面几个单词中间。
如果这一行只有一个单词或者这是最后一行,那么就不用管后面的空格了(但是还是要补充空格到maxWidth)。
我的思路比较简单,输出是一个字符串的集合res。定义一个StringBuilder作为每一行的字符串line,遍历输入的数组,判断如果line为空,直接添加进line中;如果不为空但是line加上下一个单词的长度再加一小于maxWidth,就添加一个空格和下一个单词;如果添加下一个单词会超过maxWidth,那就先处理line,将后面的空格分配到前面几个单词之间去。当然,如果这一行只有一个单词,就之间把line补充空格到maxWidth的长度。然后把line添加到集合res中。最后再把最后一行补充空格到maxWidth的长度,添加到res中即可。
代码如下。
class Solution {
public List<String> fullJustify(String[] words, int maxWidth) {
List<String> res = new LinkedList<String>();
StringBuilder line = new StringBuilder();
int blanknum = 0;
int wordnum = 0;
int remainer = 0;
int index = 0;
for(String i : words){
if(line.length()==0){
line.append(i);
}else if(line.length()+1+i.length()<=maxWidth){
line.append(" ");
line.append(i);
}else{
if(wordnum==1){
while(line.length()<maxWidth){
line.append(" ");
}
}else{
blanknum = (maxWidth - line.length())/(wordnum-1);
remainer = (maxWidth - line.length())%(wordnum-1);
line.delete(0, line.length());
for(int k=index-wordnum;k<index;k++){
line.append(words[k]);
if(line.length()<maxWidth){
for(int j=0;j<(k-index+wordnum<remainer?blanknum+2:blanknum+1);j++){
line.append(" ");
}
}
}
}
res.add(line.toString());
line.delete(0,line.length());
line.append(i);
wordnum=0;
}
index++;
wordnum++;
}
while(line.length()<maxWidth){
line.append(" ");
}
res.add(line.toString());
return res;
}
}