[leetcode]68. Text Justification

文本左右对齐算法解析
本文深入探讨了一种文本左右对齐的算法实现,重点讲解了如何在一行中均匀分配空格,特别是在处理多行文本时,如何在非最后一行进行居中对齐,以及在最后一行或单单词行进行左对齐的细节。通过具体代码示例,展示了算法的逻辑流程和关键步骤。

这一题的思路想对了,就是middle justify的时候,当一行空格不均匀分配的处理没想清楚。
不知道这题考的点在哪里

class Solution {
    public List<String> fullJustify(String[] words, int maxWidth) {
        //res保存每一个string里的单词个数
        List<Integer> res=new ArrayList<>();
        List<String> ans=new ArrayList<>();
        int j=0;
        int sum=0;
        int countline=0;
       while(j<words.length){
           //每次都先放一个单词进string里
            sum+=words[j].length();
            j++;
           //countline计数
            countline++;
            while(j<words.length&&sum+words[j].length()+1<=maxWidth){
                //这里的1是单词前的空格
                sum+=words[j].length()+1;
                countline++;
                j++;
            }
            res.add(countline);
           //sum和countline都还原0,准备下一个string
            sum=0;
            countline=0;
        }
        int k=0; //k表示每个string的第一个word的下标
        for(Integer len: res){//len is the count words of a row
            int count=0;//count是这一行所有的单词的字符数
            for(int i=k;i<len+k;i++){
                count+=words[i].length();
            }
            
            
            StringBuilder builder=new StringBuilder();
            builder.append(words[k]);//先添加每一行的第一个单词
            
            //如果是最后一行或者是该行只有一个单词,那么都是左对齐的
            if (k+len == words.length || len-1 == 0) {
                //先正常填一个空格,填一个字符串
                for (int i = k+1; i < k+len; i++) {
                    builder.append(" ");
                    builder.append(words[i]);
                }
                //之后全部补上空格
                for (int i = builder.length(); i < maxWidth; i++) {
                    builder.append(" ");
                }
            } else {
                //不是最后一行:middle justified
                //每个单词后面space的个数:(长度-累计单词总长度)/(单词个数-1)
                // r为需要平均分配到中间的空格总数
                int spaces=(maxWidth-count)/(len-1);// the space number should following each words
                int r=(maxWidth-count)%(len-1); //多出来要平均分的
                for (int i = k+1; i < k+len; i++) {
                    //先把应该分配的空格加上
                    for(int m=spaces; m > 0; m--) {
                        builder.append(" ");
                    }
                    //多余的从最左开始均匀分配!!!这里我没想到
                    if(r > 0) {
                        builder.append(" ");
                        r--;
                    }
                    builder.append(words[i]);
                }
            }
            ans.add(builder.toString());
            k=k+len;//k变成下一行的首单词的下标
        }
        
        return ans;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值