【leetcode】第68题 Text Justification 解析及java代码

这题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;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值