68. 文本左右对齐

题目链接:力扣

68. 文本左右对齐_第1张图片解题思路:遍历单词数组,确定每一行的单词数量, 之后就可以得到每一个需要补充的空格数量。从而得到单词之间需要补充的空格数量。具体算法如下:

  1. 确定每一行的单词数量
    1. 初始值:
      1. num = 0:单词数量
      2. realLength=0:这一行单词的长度
      3. isFinally = false:是否是最后一行
    2. 如果realLength+num
    3. 如果realLength + num + words[i].length()>maxWidth:退出循环
    4. realLength +=words[i].length()
    5. num++;
    6. 如果i==words.length-1:说明已经是最后一行了,isFinally=true,退出循环
  • 确定需要的空格数量:sum = maxWidth - realLength
  • 确定每个单词之间需要的空格数量
    1. 如果是最后一行:则每个单词之间的空格数量固定为1,最后补充空格到长度为maxWidth
    2. 如果不是最后一行并且一行只有一个单词:单词左对齐,在最后补充空格
    3. 不是最后一行,并且有多个单词,则,每个单词之间平均最少需要的空格数量为avg=sum/(num-1),对于不能整数的情况,会剩余prevNum = sum%(num-1)个空格,因为需要将空格均匀分配,并且左边空格数量大于右边空格数量。所以可以将剩余的prevNum个空格依次放在前prevNum个单词之间,即前prevNum单词之间有avg+1个空格,剩下的单词之间有avg个空格
  • AC代码:

    class Solution {
        public static List fullJustify(String[] words, int maxWidth) {
    
            List ans = new ArrayList<>();
            int pos = 0;
            boolean isFinally = false;
            while (pos < words.length) {
                int num = 0;
                int realLength = 0;
                for (int i = pos;i maxWidth) {
                        break;
                    }
                    realLength += words[i].length();
                    num++;
                    if (i == words.length-1) {
                        isFinally = true;
                        break;
                    }
                }
    
                StringBuilder line = new StringBuilder();
                //如果是最后一行
                if (isFinally) {
                    //需要补充的空格数量
                    int blank = maxWidth - (realLength + num-1);
                    while (num > 0) {
                        line.append(words[pos]);
                        if (num != 1) {
                            line.append(' ');
                        }
                        pos++;
                        num--;
                    }
                    while (blank > 0) {
                        line.append(' ');
                        blank--;
                    }
                    ans.add(line.toString());
                    return ans;
                }
    
                //一共需要sum个空格
                int sum = maxWidth - realLength;
                //一行只有一个单词
                if (num==1){
                    line.append(words[pos]);
                    for (int i = 0; i < sum; i++) {
                        line.append(' ');
                    }
                    pos++;
                    ans.add(line.toString());
                    continue;
                }
    
    
                //平均每个单词间需要的空格数量
                int avg = sum/(num-1);
                //前n个单词间需要avg+1个空格
                int preNum = sum % (num-1);
                for (int i =0;i

    68. 文本左右对齐_第2张图片

    你可能感兴趣的:(LeetCode_Java版,算法,leetcode,力扣,java)