LeetCode 68题:文本左右对齐

LeetCode 68题是“文本左右对齐”问题。我们需要将给定的单词列表格式化为指定的宽度,并对齐文本。以下是Java解题代码,并附上每行代码的注释:

import java.util.ArrayList;
import java.util.List;

public class TextJustification {
    public List<String> fullJustify(String[] words, int maxWidth) {
        List<String> result = new ArrayList<>(); // 创建一个列表来存储结果字符串
        int index = 0; // 初始化索引为0

        while (index < words.length) { // 遍历所有单词
            int count = words[index].length(); // 当前行的第一个单词长度
            int nextIndex = index + 1; // 下一个单词的索引

            // 尝试将尽可能多的单词放入当前行
            while (nextIndex < words.length) {
                if (words[nextIndex].length() + count + 1 > maxWidth) break; // 如果加上下一个单词和一个空格超过了最大宽度,则停止
                count += words[nextIndex].length() + 1; // 增加当前行的长度
                nextIndex++; // 移动到下一个单词
            }

            StringBuilder builder = new StringBuilder(); // 创建一个字符串构建器
            int diff = nextIndex - index - 1; // 当前行的单词之间的空格数量

            // 如果是最后一行,或者只有一个单词,左对齐
            if (nextIndex == words.length || diff == 0) {
                for (int i = index; i < nextIndex; i++) {
                    builder.append(words[i]); // 添加单词
                    if (i < nextIndex - 1) builder.append(" "); // 添加空格
                }
                for (int i = builder.length(); i < maxWidth; i++) {
                    builder.append(" "); // 用空格填充剩余空间
                }
            } else {
                // 平均分配空格
                int spaces = (maxWidth - count) / diff; // 每个空隙的平均空格数
                int extraSpaces = (maxWidth - count) % diff; // 需要额外添加的空格数

                for (int i = index; i < nextIndex; i++) {
                    builder.append(words[i]); // 添加单词
                    if (i < nextIndex - 1) {
                        for (int j = 0; j <= (spaces + (i - index < extraSpaces ? 1 : 0)); j++) {
                            builder.append(" "); // 添加空格
                        }
                    }
                }
            }
            result.add(builder.toString()); // 将结果添加到结果列表中
            index = nextIndex; // 移动到下一个单词
        }

        return result; // 返回结果列表
    }
}

这段代码实现了文本左右对齐的功能。主要思路是通过遍历单词列表,将单词逐行加入结果中,并在每行中根据需要添加适当数量的空格来实现对齐。

思路总结:

  1. 初始化和准备

    • 创建一个结果列表 result 来存储格式化后的每一行。
    • 使用一个索引 index 来遍历单词列表 words
  2. 逐行处理单词

    • 使用一个循环来填充每一行的单词,直到达到最大宽度 maxWidth
    • 对于每一行,首先计算该行可以容纳的单词数量。
    • 计算当前行内单词的总长度(包括单词之间的空格)。
  3. 判断对齐类型

    • 左对齐:如果是最后一行,或者当前行只有一个单词,则左对齐:
      • 将单词依次加入行中,并在单词之间加入一个空格。
      • 用空格填充整行至 maxWidth
    • 两端对齐:如果不是最后一行且有多个单词:
      • 计算每个空隙的平均空格数 spaces
      • 计算需要额外增加的空格数 extraSpaces
      • 将这些空格均匀地分配到单词之间。
  4. 更新索引

    • 更新 index 到下一行的起始单词位置。
  5. 返回结果

    • 将格式化后的每一行加入 result 列表并返回。

通过这种方式,我们可以确保每一行的文本都能准确地对齐到给定的宽度,并呈现出整齐的格式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值