文本左右对齐

hello 大家好!今天开写一个新章节,每一天一道算法题。让我们一起来学习算法思维吧!

javascript 复制代码
function fullJustify(words, maxWidth) {
    // 用于存储最终排版好的每一行文本
    const result = [];
    // 用于遍历单词数组的索引,初始化为 0
    let i = 0;

    // 开始遍历单词数组,直到所有单词都被处理完
    while (i < words.length) {
        // 用于存储当前行要放置的单词
        let lineWords = [];
        // 当前行已使用的字符长度(仅包含单词长度,不包含单词间的空格),初始化为 0
        let currentLength = 0;

        // 尽可能多地往当前行添加单词
        // 条件判断:i 小于单词数组长度,并且当前行添加新单词和对应空格后的总长度不超过 maxWidth
        while (i < words.length && currentLength + words[i].length + lineWords.length <= maxWidth) {
            // 将当前单词添加到当前行的单词列表中
            lineWords.push(words[i]);
            // 更新当前行已使用的字符长度,加上新添加单词的长度
            currentLength += words[i].length;
            // 移动到下一个单词
            i++;
        }

        // 计算当前行还需要添加多少个空格才能达到 maxWidth 的长度
        let spacesToAdd = maxWidth - currentLength;
        // 用于存储当前行最终排版好的文本
        let line = '';

        // 判断是否为最后一行或者当前行只有一个单词
        if (i === words.length || lineWords.length === 1) {
            // 如果是最后一行或者只有一个单词,采用左对齐的方式
            // 将当前行的单词用单个空格连接起来
            line = lineWords.join(' ');
            // 在连接好的单词后面添加剩余所需的空格,使整行长度达到 maxWidth
            line += ' '.repeat(maxWidth - line.length);
        } else {
            // 计算平均每个单词间隔需要添加的空格数
            let spacesBetweenWords = Math.floor(spacesToAdd / (lineWords.length - 1));
            // 计算平均分配后剩余的额外空格数,这些额外空格要优先放在左侧的间隔中
            let extraSpaces = spacesToAdd % (lineWords.length - 1);

            // 遍历当前行的每个单词
            for (let j = 0; j < lineWords.length; j++) {
                // 将当前单词添加到当前行的文本中
                line += lineWords[j];
                // 如果不是最后一个单词,需要添加单词间的空格
                if (j < lineWords.length - 1) {
                    // 先添加平均分配的空格数
                    // 再判断是否还有额外空格,如果有且当前是前面的间隔(j < extraSpaces),则多添加一个空格
                    line += ' '.repeat(spacesBetweenWords + (j < extraSpaces? 1 : 0));
                }
            }
        }

        // 将当前行排版好的文本添加到最终结果数组中
        result.push(line);
    }

    // 返回最终排版好的文本数组
    return result;
}

// 测试示例
const words = ["This", "is", "an", "example", "of", "text", "justification."];
const maxWidth = 16;
console.log(fullJustify(words, maxWidth));

代码思路总结

这段代码的核心思路是使用贪心算法来处理单词排版问题。首先,尝试在每一行中尽可能多地添加单词,直到无法再添加而不超过 maxWidth 限制。然后,根据当前行是否为最后一行或者是否只有一个单词,采用不同的排版方式:

  • 最后一行或只有一个单词:左对齐,单词间用单个空格连接,剩余长度用空格填充在末尾。
  • 其他行:计算平均每个单词间隔应有的空格数以及剩余的额外空格数,优先将额外空格分配到左侧的间隔中,以保证左侧的空格数多于右侧。
相关推荐
_Evan_Yao23 分钟前
Redis 缓存穿透、击穿、雪崩,一次讲清!
java·spring·mybatis
梓豪csd1 小时前
消息订阅中心:谁该收到哪条通知
java·开发语言·人工智能·低代码·自动化·1024程序员节
秋饼1 小时前
Spring AI 2.1 Message Parts 深度实战:推理签名回放与跨轮记忆持久化的源码级落地
java·ai·技术分享·后端开发
BK贝壳1 小时前
bool-hybrid-array 落盘我只认 .bha:用 Create_BHA / Ask_BHA 做布尔数组序列化
数据结构·python·numpy·1024程序员节
thefool1122662 小时前
TCP 1
java·1024程序员节
美狐美颜SDK开放平台2 小时前
准备开发直播APP?视频美颜SDK接入前的十项检查清单
android·ios·音视频·直播美颜sdk·视频美颜sdk
传奇开心果编程3 小时前
【Jetpack Compose娓娓道来】第26课:Repository模式与数据层设计——数据的唯一入口
android·移动开发·1024程序员节·jetpack compose·编程语言理论·编程框架·声明式ui
企业数字化笔记4 小时前
视频人体姿态怎么做三维可视化?2D关键点、深度局限与技术选型
人工智能·算法·音视频
paopaokaka_luck4 小时前
宠物门店经营管理系统(销售与库存联动、进货自动记账、 退换与退款关联、员工个人业绩、ECharts 经营分析、滞销识别与客户分层、宠物档案年龄计算)
前端·javascript·spring boot·mysql·echarts·mybatis·1024程序员节
金銀銅鐵4 小时前
[Java] 用 GUI 展示 EnumSet 增减元素时的内部变化(下)
java·后端·ai编程