LeetCode68文本左右对齐

1.先取出一行能够容纳的单词,将这些单词根据规则填入一行
2.计算出额外空格的数量 spaceCount,额外空格就是正常书写用不到的空格
	2.1除去所有单词的长度
3.平均分布:简单来说就是商和余数的计算
4.特殊处理
	4.1一行只有一个单词,单词左对齐,右侧填满空格
	4.2最后一行,所有单词左对齐,中间只有一个空格,最后一个单词右侧填满空格

在这里插入图片描述
需要填充的空格数量就是词尾空格 + 额外空格,当然最后一个单词的词尾空格不算。具体计算请看下面代码展示。
在这里插入图片描述

class Solution {
    public List<String> fullJustify(String[] words, int maxWidth) {
        List<String> res = new ArrayList<>();
        int i = 0;
        int n = words.length;
        while (i < n) {
            // 找到一行可以容下的单词
            int left = i;
            // 至少一行能放下一个单词
            // 注意第一个单词不能 + 1,
            // 因为如果只有一个单词,那么不需要加空格,也就不需要 + 1
            int cur_row_len = words[i].length();
            i++;

            while (i < n) {
                if (cur_row_len + words[i].length() + 1 > maxWidth) {
                    break;
                }
                //这里有空格,所以要 + 1
                cur_row_len += words[i].length() + 1;
                i++;
            }
            StringBuilder tmp = new StringBuilder();
            // 考虑最后一行
            if (i == n) {
                for (int j = left; j < i; j++) {
                    tmp.append(words[j] + " ");
                }
                //对应特殊处理4.2
                //如果最后一个空格正好大于maxWidth,需要删去
                tmp.deleteCharAt(tmp.length() - 1);
                for (int j = tmp.length(); j < maxWidth; j++) {
                    tmp.append(" ");
                }
                res.add(tmp.toString());
                break;
            }
            // 所有单词长度
            int all_word_len = 0;
            for (int j = left; j < i; j++) {
                all_word_len += words[j].length();
            }
            //System.out.println(all_word_len);
            // 至少空格个数,也就是 4个单词,三个空格
            int space_num = i - left - 1;
            // 需要填充的空格数量
            int remain_space = maxWidth - all_word_len;
            int a = 0;
            int b = 0;
            //i不等于n,能放下多个单词,就需要计算空格平均分配
            if (space_num != 0) {
                a = remain_space / space_num;
                b = remain_space % space_num;
            }
            //空格平均分配
            for (int j = left; j < i; j++) {
                if (j > left) {
                    for (int k = 0; k < a; k++) {
                        tmp.append(" ");
                    }
                    if (b != 0) {
                        tmp.append(" ");
                        b--;
                    }
                }
                tmp.append(words[j]);
            }
            //i不等于n,而且只能放下一个单词,就需要执行下面语句,因为上面的for循环并没有加入空格
            //对应特殊处理4.1
            for (int j = tmp.length(); j < maxWidth; j++) {
                tmp.append(" ");
            }
            res.add(tmp.toString());
        }
        return res;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值