CodeCollection2018
8/27/2019 - 6:46 AM

Text Justification

将一个字符串数组写成多行,每行长度相同均为L,同时每行空格尽量均匀除了最后一行之外,最后一行就可以依左,其他行相当于全行铺开。

//想法好想但是实现起来困难,还是想法对程序之间的映射没有建立起来,包括该用什么数据结构,循环判断条件,变量设定。
public List<String> fullJustify(String[] words,int L){
    List<String> res = new ArrayList<>();
    int i = 0;
    while( i < words.length){
        int j=i,len=0;
        while(j < words.length && len+words[j].length()+j-i<=L)
            len += words[j++].length();  //查找该行可以容纳多少个单词,len+words[j].length()是单词长度,j-i是空格长度。
        String out = null;
        int space = L-len;//实际会插入的空格的个数
        for(int k = i ; k < j; k++){  //针对每个单词计算其后面需要插入的空格的个数
            out += words[k];//先把单词放入
            if(space > 0){//再去判断空格个数,space代表还剩下多少空格
                int tmp;
                if(j == words.length){//如果j所处的是最后一行则特殊对待
                    if(j==k+1) tmp=space;//如果k=j-1说明这是最后一个单词则其后面的空格就是剩下多少是多少
                    else tmp=1;//如果k不是最后一行最后一个单词则都是每个单词后面接1.
                }else{//如果j所处的不是最后一行
                    if(j-k-1 > 0){//如果k指的不是最后一个则平均化空格
                        if(space%(j-k-1)==0) tmp=space/(j-k-1);
                        else tmp = space/(j-k-1)+1;
                    }else tmp = space;//该行剩下的空格数都给最后一个单词后面插入
                }
                out.append(tmp," ");//实际插入空格
                space -= tmp;//空格数要减少
            }
        }
        res.add(out);
        i=j;
    }
    return res;
}