68. Text Justification

    /*
     * 68. Text Justification 
     * 2016-5-9 by Mingyang
     * 首先是我的代码
     */
     public List<String> fullJustify1(String[] words, int maxWidth) {
            int start=0;
            StringBuffer sb=new StringBuffer();
            List<String> res=new ArrayList<String>();
            while(start<words.length){
                if(sb.toString().length()+words[start].length()>maxWidth){
                    res.add(alignment(sb,maxWidth));
                    sb=new StringBuffer();
                    start++;
                }else{
                    sb.append(" ");
                    sb.append(words[start]);
                    start++;
                }
            }
            if(sb.toString().length()!=0){
                res.add(sb.toString());
            }
            return res;
        }
       public static String alignment(StringBuffer sb,int L){
                String temp=sb.toString().trim();
                String[] array=temp.split(" ");
                int sum=0;
                for(int i=0;i<array.length;i++){
                    sum+=array[i].length();
                }
                int space=(L-sum)/(array.length-1);
                String re="";
                while(space>0){
                    re=re+" ";
                    space--;
                }
                StringBuffer res=new StringBuffer();
                for(int i=0;i<array.length;i++){
                    res.append(array[i]);
                    res.append(re);
                }
                String result=res.toString().trim();
                if(result.length()<L){
                    sb.insert(0, " ");
                }
                return result;
            }
       /*
        * 网上的代码  
        */
    public static ArrayList<String> fullJustify(String[] words, int L) {
        ArrayList<String> res = new ArrayList<String>();
        if (words == null || words.length == 0)
            return res;
        int count = 0;
        int last = 0;
        for (int i = 0; i < words.length; i++) {
            // count是上一次计算的单词的长度,words[i].length()是当前尝试放的一个单词的长度,
            // 假设当前放上了这个单词,那么这一行单词跟单词间的间隔数就是i-last
            // 判断这些总的长度加起来是不是大于L(超行数了)
            if (count + words[i].length() + (i - last) > L) {
                int spaceNum = 0;
                int extraNum = 0;
                // 因为尝试的words[i]失败了,所以间隔数减1.此时判断剩余的间隔数是否大于0
                if (i - last - 1 > 0) {
                    // 是间隔的倍数(为啥要减1,因为尝试当前words[i]后发现比L长了,
                    // 所以当前这个单词不能算作这行,所以间隔就减少一个
                    spaceNum = (L - count) / (i - last - 1);
                    extraNum = (L - count) % (i - last - 1);// 不是倍数的话还要计算
                }
                StringBuilder str = new StringBuilder();
                for (int j = last; j < i; j++) {
                    str.append(words[j]);
                    if (j < i - 1) {// words[i-1]的话后面就不用填空格了,所以这里j<i-1
                        for (int k = 0; k < spaceNum; k++)
                            str.append(" ");

                        if (extraNum > 0)
                            str.append(" ");

                        extraNum--;
                    }
                }

                // 下面这个for循环作用于一行只有一个单词还没填满一行的情况
                for (int j = str.length(); j < L; j++)
                    str.append(" ");

                res.add(str.toString());
                count = 0;
                last = i;// 下一个开始的单词
            }
            count += words[i].length();
        }

        // 处理最后一行
        StringBuilder str = new StringBuilder();
        for (int i = last; i < words.length; i++) {
            str.append(words[i]);
            if (str.length() < L)
                str.append(" ");
        }
        for (int i = str.length(); i < L; i++)
            str.append(" ");

        res.add(str.toString());
        return res;
    }