[leetcode] 68. 文本左右对齐

文章目录

  • 题目描述
  • 解题方法
    • 贪心
      • java代码
      • 复杂度分析

题目描述

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

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

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

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

注意:

  • 单词是指由非空格字符组成的字符序列。
  • 每个单词的长度大于 0,小于等于 maxWidth
  • 输入单词数组 words 至少包含一个单词。

示例 1:

输入: words = ["This", "is", "an", "example", "of", "text", "justification."], maxWidth = 16
输出:
[
   "This    is    an",
   "example  of text",
   "justification.  "
]

示例 2:

输入:words = ["What","must","be","acknowledgment","shall","be"], maxWidth = 16
输出:
[
  "What   must   be",
  "acknowledgment  ",
  "shall be        "
]
解释: 注意最后一行的格式应为 "shall be    " 而不是 "shall     be",
     因为最后一行应为左对齐,而不是左右两端对齐。       
     第二行同样为左对齐,这是因为这行只包含一个单词。

示例 3:

输入:words = ["Science","is","what","we","understand","well","enough","to","explain","to","a","computer.","Art","is","everything","else","we","do"],maxWidth = 20
输出:
[
  "Science  is  what we",
  "understand      well",
  "enough to explain to",
  "a  computer.  Art is",
  "everything  else  we",
  "do                  "
]

提示:

  • 1 <= words.length <= 300
  • 1 <= words[i].length <= 20
  • words[i] 由小写英文字母和符号组成
  • 1 <= maxWidth <= 100
  • words[i].length <= maxWidth

解题方法

贪心

思路就是按照上面的规则来个每一行放置单词。

我们可以总结出以下几种情况。

  1. 除最后一行外,每一行的单词有两种情况。
  • 当该行单词数 > 1时,需要给单词之间加空格,最后一个单词刚好放到末尾,后面无空格。
  • 当该行单词数 = 1时,只需要给该单词后面加空格。
  1. 如果是最后一行,除最后一个单词外,需要给每个单词后面加一个空格。最后一个单词后面补充剩余的空格。

总结出以上情况后,那我们就可以构建思路了。

我们可以记录几个变量curWidth代表当前行的单词长度curNums代表当前行的单词个数words[i]代表下一个要添加的单词。当curWidth + words[i].length() + curNums <= maxWidth时,当前行就可以加入新单词;否则,将当前行组成的字符串加入结果集。curWidthcurNums重置为0

接下来就是怎么添加单词后面的空格了。我们可以计算当前行可以添加的空格数量,然后根据上面总结的情况将空格合理分配到单词后面。这块可以看代码实现,我已将部分重要的注释加入到代码中。

java代码

public List<String> fullJustify(String[] words, int maxWidth) {
    List<String> list = new ArrayList<>();
    int i = 0;
    // 记录当前行的单词长度
    int curWidth = 0;
    // 记录当前行的单词个数
    int curNums = 0;
    while (i < words.length) {
        // 当前行单词长度 + 下一个单词长度 + 当前行的单词数量(最少空格数量) < 最大宽度,说明可以把下一个单词加入当前行
        if (curWidth + words[i].length() + curNums <= maxWidth) {
            curWidth += words[i].length();
            curNums++;
            i++;
        } else {
            // 空格个数
            int spaces = maxWidth - curWidth;
            int a = 0;
            int b = 0;
            // 当前行单词数 > 1 时
            if (curNums - 1 != 0) {
                // 除当前行的最后一个单词外,每个单词后面至少加a个空格,前b个单词后面还需要再加1个空格
                a = spaces / (curNums - 1);
                b = spaces % (curNums - 1);
            }
            StringBuilder lineBuilder = new StringBuilder();
            for (int j = 0; j < curNums - 1; j++) {
                // 加单词
                lineBuilder.append(words[i - curNums + j]);
                // 加空格
                for (int k = 0; k < a; k++) {
                    lineBuilder.append(' ');
                }
                if (b-- > 0) {
                    lineBuilder.append(' ');
                }
            }
            // 加当前行的最后一个单词
            lineBuilder.append(words[i - 1]);
            // 如果该行只有一个单词,需要在单词后面的剩余空间加上空格
            if (curNums == 1) {
                while (spaces-- > 0) {
                    lineBuilder.append(' ');
                }
            }
            // 当前行加入结果集
            list.add(lineBuilder.toString());
            // 当前行加入结果集后,当前行宽度和当前行单词个数重置为0
            curWidth = 0;
            curNums = 0;
        }
    }
    StringBuilder lineBuilder = new StringBuilder();
    // 最后一行结果集先加单词,再加1个空格
    for (int j = 0; j < curNums - 1; j++) {
        lineBuilder.append(words[i - curNums + j]);
        lineBuilder.append(' ');
    }
    // 剩余空格个数
    int spaces = maxWidth - curWidth - (curNums - 1);
    lineBuilder.append(words[i - 1]);
    // 最后一个单词后面把剩余空格都加上
    while (spaces-- > 0) {
        lineBuilder.append(' ');
    }
    // 最后一行加入结果集
    list.add(lineBuilder.toString());
    return list;
}

复杂度分析

时间复杂度: O ( m ) O(m) O(m) m m m是单词长度总和 + 空格总和。
空间复杂度: O ( m ) O(m) O(m),结果需要提供 O ( m ) O(m) O(m)的存储空间。


  • 个人公众号
    个人公众号
  • 个人小游戏
    个人小游戏

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/603458.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

运用远期交易防范外汇风险

随着全球化的深入&#xff0c;跨境贸易和投资愈加频繁&#xff0c;外汇风险成为各类企业和投资者必须面对的现实问题。汇率的波动可能导致交易和投资的成本大幅增加&#xff0c;甚至引发利润损失。在这种情况下&#xff0c;远期交易作为一种有效的外汇风险对冲工具&#xff0c;…

2023年全国职业院校技能大赛(高职组)“云计算应用”赛项赛卷1(私有云)

#需要资源&#xff08;软件包及镜像&#xff09;或有问题的&#xff0c;可私聊博主&#xff01;&#xff01;&#xff01; #需要资源&#xff08;软件包及镜像&#xff09;或有问题的&#xff0c;可私聊博主&#xff01;&#xff01;&#xff01; #需要资源&#xff08;软件包…

源代码加密

代码加密&#xff0c;特别是源代码加密&#xff0c;是一种安全措施&#xff0c;旨在保护软件的源代码不被未授权访问或泄露。源代码是软件应用程序的原始编程文本&#xff0c;它包含了程序的逻辑、算法和设计思想。由于源代码包含了软件的核心知识&#xff0c;因此它具有极高的…

数智算网,链启未来 | 算力网络子链诚邀各方加入

4月28日&#xff0c;在中国移动算力网络大会期间&#xff0c;由中国移动集团主办&#xff0c;中国移动研究院和云能力中心联合承办的“数智算网&#xff0c;链启未来”共链行动算力网络专场会议成功召开。中国移动研究院副院长段晓东&#xff0c;中国移动集团首席专家、云能力中…

MySQL·内置函数

目录 函数 日期函数 案例1&#xff1a;创建一张表&#xff0c;记录生日 案例2&#xff1a;创建一个留言表 案例3&#xff1a;请查询在2分钟内发布的帖子 字符串函数 案例1&#xff1a; 获取emp表的ename列的字符集 案例2&#xff1a;要求显示exam_result表中的信息&am…

Vinted店铺总被封号?如何有效养号?

Vinted是一家欧洲知名的二手时尚交易平台&#xff0c;致力于连接买家和卖家&#xff0c;让他们能够在平台上买卖二手时尚商品。用户可以在Vinted上销售和购买服装、鞋子、配饰等各种时尚物品&#xff0c;无论是品牌商品还是非品牌商品&#xff0c;都可以在平台上找到。Vinted的…

idea修改maven项目名称及子模块名称

一、修改目录名称 shift F6修改目录&#xff0c;选择“rename module and dictionary”。![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/43efd9c6af6e43ad9656455db94b37a2.png)二、修改子项目pom的 三、修改父项目pom的 四、刷新maven项目

JS笔试手撕题

数据劫持 Vue2的Object.defineProperty() Vue2的响应式是通过Object.defineProperty()拦截数据&#xff0c;将数据转换成getter/setter的形式&#xff0c;在访问数据的时候调用getter函数&#xff0c;在修改数据的时候调用setter函数。然后利用发布-订阅模式&#xff0c;在数…

Windows下启动Tomcat显示乱码解决办法

1、Windows下启动Tomcat显示乱码 2、解决办法 找到 D:\apache-tomcat-9.0.89\conf下的logging.properties&#xff0c;找到java.util.logging.ConsoleHandler.encoding的值改为GBK&#xff0c;就可以了 完美解决&#xff01;显示正常的中文了

网络安全之二层局域网封装及广域网封装详解

局域网封装&#xff1a;Ethernet2&#xff08;TCP/IP&#xff09;&#xff0c;IEEE802.3&#xff08;OSI&#xff09;&#xff08;前面文章中讲解了TCP、IP和OSI本文就不继续讲解&#xff1a;可以查看&#xff1a;网络安全之OSI七层模型详解-CSDN博客&#xff09; 广域网封装&…

『ZJUBCA Collaboration』WTF Academy 赞助支持

非常荣幸宣布&#xff0c;浙江大学区块链协会收到WTF Academy的赞助与支持&#xff0c;未来将共同开展更多深度合作。 WTF Academy是开发者的Web3开源大学&#xff0c;旨在通过开源教育让100,000名开发者进入到Web3。截止目前&#xff0c;WTF开源教程在GitHub收获超15,000 ⭐&a…

环形链表问题详解

引言 环形链表的题大家都应该做过&#xff0c;如果没有做过可以去某扣上做一下 ,下面有传送门 141. 环形链表 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/linked-list-cycle/submissions/530160081/ 正文 如果在面试的情况下出现了环形链表的题大…

QLineEdit 最右侧添加按钮

如果采用QLineEdit + QPushButton的方式的话,无法将按钮放到QLineEdit的输入框内部,所以下面的方法可以将按钮放到QLineEdit内部的最右侧,效果: 代码如下: QLineEdit* editor = new QLineEdit(parent); QToolButton* btn = new QToolButton; btn->setText("...&q…

【噪声学习】噪声标签的鲁棒点云分割

Robust Point Cloud Segmentation with Noisy Annotations 事实上,与二维图像标注[1]、[2]相比,三维数据的干净标签更难获得。这主要是因为1)需要标注的点数通常非常庞大,例如在 ScanNetV2 [3] 中标注一个典型的室内场景时,需要标注百万量级的点数;2)标注过程本身更加复…

使用SmartEDA电路仿真软件,让这五件事变得很简单

SmartEDA电路仿真软件&#xff1a;轻松实现电子设计五大突破 在电子设计领域&#xff0c;SmartEDA电路仿真软件以其强大的功能和用户友好的界面&#xff0c;成为了设计师们的得力助手。这款软件不仅简化了电路设计流程&#xff0c;还提高了设计效率&#xff0c;让以下五件事情…

【驱动】I2C读写时序

1、I2C总线 I2C使用两条线在主控制器和从机之间通信,SCL(串行时钟线)和SDA(串行数据线),这两条线需接5~10欧上拉电阻,总线空闲空闲时,SCL和SDA处于高电平,I2C总线标准模式速度可以达到100K/S,快速模式可以达到400K/S。 2、状态 I2C总线有四种状态:空闲、启动、忙碌、…

品质为王:高效溶解性鱼油胶囊的软胶囊弹性硬度测试解析

品质为王&#xff1a;高效溶解性鱼油胶囊的软胶囊弹性硬度测试解析 在当今的健康产品市场中&#xff0c;高效溶解性鱼油胶囊以其独特的营养价值和吸收效率赢得了众多消费者的青睐。然而&#xff0c;要想在激烈的市场竞争中脱颖而出&#xff0c;产品的品质保证至关重要。其中&a…

RabbitMQ-基础

RabbitMQ 同步调用 双方交互都是实时的&#xff0c;可以立即返回结果 问题 拓展性差&#xff1a;每次有新的需求&#xff0c;代码经常变动&#xff0c;不符合开闭原则性能下降&#xff1a;调用者需要等待服务提供者分别执行后才返回结果&#xff0c;服务提供者很多情况下会…

看完这个,你就懂了!IT审计到底是干什么的?如何做好IT审计?

01 大家应该都知道财务审计&#xff0c; 通俗讲&#xff0c;就是查账的。 看一下公司账上的数据是否准确&#xff0c; 每笔账是否都能合理溯源。 那IT审计到底是干什么的呢&#xff1f; 它和财务审计有什么关系吗&#xff1f; 这么跟你说吧&#xff0c; 现在很多公司都…

Etcd集群选举细节

日志级别 在 etcd 集群中&#xff0c;领导者选举是 Raft 协议的一部分&#xff0c;用于在当前领导者失败或无法与集群中的其他节点通信时选出新的领导者。以下是您提供的日志中与领导者选举相关的一些关键条目&#xff0c;以及对它们的详细说明&#xff1a; 节点失去领导者&am…