当前位置: 首页 > article >正文

算法练习题: 文本左右对齐

文本左右对齐

给定一个单词数组 words 和一个长度 maxWidth ,重新排版单词,使其成为每行恰好有 maxWidth 个字符,且左右两端对齐的文本。

你应该使用 “贪心算法” 来放置给定的单词;也就是说,尽可能多地往每行中放置单词。必要时可用空格 ’ ’ 填充,使得每行恰好有 maxWidth 个字符。

要求尽可能均匀分配单词间的空格数量。如果某一行单词间的空格不能均匀分配,则左侧放置的空格数要多于右侧的空格数。

文本的最后一行应为左对齐,且单词之间不插入额外的空格。

要实现这个功能,我们可以按照以下步骤进行:

1、初始化一个空的结果数组 result。
2、遍历单词数组 words,将每个单词添加到当前行中,直到当前行的字符数加上下一个单词的长度超过 maxWidth。
3、如果当前行只有一个单词或者已经到达单词数组的末尾,则直接将当前行添加到结果数组中。
4、否则,计算当前行需要填充的空格数量,并均匀分配到单词之间。如果不能均匀分配,左侧的空格多于右侧。
5、将格式化后的当前行添加到结果数组中,并重置当前行为空。
6、重复步骤2-5,直到处理完所有单词。
7、返回结果数组。
以下是实现这个功能的 JavaScript 代码示例:

function fullJustify(words, maxWidth) {
    let result = [];
    let currentLine = [];
    let currentLength = 0;

    for (let word of words) {
        if (currentLength + word.length + currentLine.length > maxWidth) {
            let spaces = maxWidth - currentLength;
            let extraSpaces = currentLine.length > 1 ? spaces % (currentLine.length - 1) : 0;
            let spaceBetween = spaces / (currentLine.length - 1) || 0;
            let line = '';

            for (let i = 0; i < currentLine.length; i++) {
                line += currentLine[i];
                if (i < currentLine.length - 1) {
                    line += ' '.repeat(spaceBetween);
                    if (extraSpaces > 0) {
                        line += ' ';
                        extraSpaces--;
                    }
                }
            }

            result.push(line);
            currentLine = [word];
            currentLength = word.length;
        } else {
            currentLine.push(word);
            currentLength += word.length;
        }
    }

    let lastLine = currentLine.join(' ').trim();
    lastLine += ' '.repeat(maxWidth - lastLine.length);
    result.push(lastLine);

    return result;
}

// Example usage:
const words = ["This", "is", "an", "example", "of", "text", "justification."];
const maxWidth = 16;
console.log(fullJustify(words, maxWidth));

这段代码首先定义了一个名为 fullJustify 的函数,它接受一个单词数组 words 和一个整数 maxWidth 作为参数。函数的主体部分使用贪心算法来构建每一行的文本,并在最后一行左对齐。最后,函数返回一个包含所有格式化行的数组。

下面是实现这个算法的 Python 代码示例:

def fullJustify(words, maxWidth):
    def justify_line(line, maxWidth):
        if len(line) == 1:
            return line[0] + ' ' * (maxWidth - len(line[0]))
        
        total_spaces = maxWidth - sum(len(word) for word in line)
        space_between = total_spaces // (len(line) - 1)
        extra_spaces = total_spaces % (len(line) - 1)
        
        justified_line = []
        for i in range(len(line) - 1):
            justified_line.append(line[i])
            justified_line.append(' ' * space_between)
            if extra_spaces > 0:
                justified_line.append(' ')
                extra_spaces -= 1
        
        justified_line.append(line[-1])
        return ''.join(justified_line)
    
    result = []
    current_line = []
    current_length = 0
    
    for word in words:
        if current_length + len(word) + len(current_line) > maxWidth:
            result.append(justify_line(current_line, maxWidth))
            current_line = []
            current_length = 0
        
        current_line.append(word)
        current_length += len(word)
    
    last_line = ' '.join(current_line)
    result.append(last_line + ' ' * (maxWidth - len(last_line)))
    
    return result

# Example usage:
words = ["This", "is", "an", "example", "of", "text", "justification."]
maxWidth = 16
print(fullJustify(words, maxWidth))

这段代码首先定义了一个辅助函数 justify_line,用于处理如何对齐一行中的单词和空格。然后,主函数 fullJustify 遍历单词数组,将单词添加到当前行,直到无法再添加更多单词而不超过 maxWidth。最后,它调用 justify_line 来格式化每行,并将结果添加到结果列表中。


http://www.kler.cn/a/283028.html

相关文章:

  • 鸿蒙next版开发:相机开发-适配不同折叠状态的摄像头变更(ArkTS)
  • 【机器学习】机器学习中用到的高等数学知识-2.概率论与统计 (Probability and Statistics)
  • 【日志】392.判断子序列
  • C++初阶——list
  • Xshell,Shell的相关介绍与Linux中的权限问题
  • Qt 获取当前系统中连接的所有USB设备的信息 libudev版
  • 【Java-存储超大整数】
  • Git 分支操作全解析:创建、切换、合并、删除及冲突解决
  • SpringBoot+Vue餐馆点菜系统小程序
  • Spring MVC学习路线指南
  • Windows Edge浏览器的兼容性问题
  • 命令模式的实际应用案例:从电梯控制系统到文本编辑器
  • Ruby宝石光芒:探索SEO优化的瑰宝工具与库
  • 13.DataLoader 的使用
  • LuaJit分析(二)luajit反编译工具
  • Linux——驱动——自动设备
  • Nginx: 缓存, 不缓存特定内容和缓存失效降低上游压力策略及其配置示例
  • 基于python文案转语音并输出-自媒体等职业副业均可使用,不受他人限制
  • 从“云、边、端”的统一管理,为传统工厂数字化转型赋能的智慧地产开源了
  • OpenAI API Error: Resource not found - Text Summarization in NodeJS
  • QT中引入SQLITE3数据库
  • 自定义全局变量在SpringBoot的应用
  • 后端完成api顺序
  • 外卖霸王餐项目是什么?怎么搭建属于自己的外卖霸王餐小程序 ?
  • 灰度发布-介绍-全链路灰度实现
  • 由浅入深学习 C 语言:Hello World【提高篇】