[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());// 当前行加入结果集后,当前行宽度和当前行单词个数重置为0curWidth = 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)的存储空间。


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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Unity 状态机

文章目录 前言一、状态机二、应用1、场景切换2、人物行为切换3、宝箱、机关切换4、AI 三、人物行为总结 前言 提到Unity状态机&#xff0c;接触不久的开发者会想到Unity的动画状态机&#xff0c;而对于老油条来说&#xff0c;可能会回忆起自己实现的动画状态机。当然&#xff…

The 2024 International Collegiate Programming Contest in Hubei Province, China

目录 H. Genshin Impact Startup Forbidden III K. Points on the Number Axis B 估计还会补D&#xff0c;I H. Genshin Impact Startup Forbidden III 对于一个有鱼的池塘&#xff0c;有周围与自己本身五个关键位置可以捕获当前位位置的鱼。把这些位置存储到 map中。用四进制…

深入理解京东商品搜索API(jd.item_search)返回值结构

京东商品搜索API&#xff08;jd.item_search&#xff09;的返回值结构通常是一个复杂的JSON对象&#xff0c;它包含了关于搜索结果的详细信息。为了深入理解这个返回值结构&#xff0c;我们可以将其大致分解为几个主要部分。 status: code: 响应状态码&#xff0c;通常200表示成…

数据治理实施方案大纲

一、引言 背景介绍 阐述数据治理的重要性和必要性回顾公司或组织在数据管理方面的发展历程指出当前数据管理面临的挑战和机遇 目标和愿景 明确数据治理的总体目标和愿景设定短期和长期的数据治理目标 范围和限制 定义数据治理项目的范围和边界识别可能影响项目成功的限制因素 …

新品 | 功率放大器高压放大测试器HAP-4001

400V功率放大器是一台非常实用的讯号放大器&#xff0c;它具有体积小、重量轻及操作方便&#xff0c;较高的电压输出(400Vp-p)以及较大的输出电流&#xff08;2.8Ap-p&#xff09;等优点。 HAP-4001连续输出直流电流量最大值达到0.5 A&#xff0c;电压放大增益40倍&#xff0c…

OSI七层模型

ISO为了更好的使网络应用更为普及&#xff0c;推出了OSI参考模型。 &#xff08;1&#xff09;应用层 OSI参考模型中最靠近用户的一层&#xff0c;是为计算机用户提供应用接口&#xff0c;也为用户直接提供各种网络服务。我们常见应用层的网络服务协议有&#xff1a;HTTP&…

Java---类和方法的再学习

上一篇主要介绍了面向对象的思想以及内存实现&#xff0c;关于类与对象感觉写的不够好&#xff0c;因此才会有这一篇作为补充&#xff1b; 一&#xff1a;类与对象 &#xff08;1&#xff09;类 一些相同属性和行为的事物的统称&#xff0c;比较广泛、抽象&#xff0c;比如…

Echarts柱状图横坐标不显示

本人遇到的问题&#xff1a;折线图横坐标可以正常显示 柱状图接收一样的数据在横坐标却显示不了 1.在前端打印是否能够正常接收数据、数据类型是否有误以及数据是否有内容 console.log(typeof optionbar.xAxis.data)console.log(optionbar.xAxis.data) 2.如上确定能够接收到数…

netty 高性能架构设计--零拷贝

文章目录 前言一、直接内存1.1 什么是直接内存1.2 代码实现1.3 使用直接内存的优缺点 二、netty 零拷贝设计2.1 netty 直接内存2.2 netty 内存池 三、零拷贝的两种方式 前言 本篇从源码层面剖析 netty 高性能架构设计之零拷贝&#xff0c;并且扩展讲述零拷贝的两种实现方式。 …

有没有不使用技术分析工具的?众汇10年交易经验发现还真有

不知道各位投资者有没有遇见过不使用技术分析工具的投资者&#xff0c;众汇用自己的10年外汇交易经验保证&#xff0c;别不信还真有&#xff0c;并且不在少数。 其实道理很简单&#xff0c;这些投资者不相信技术分析工具的效率!在这些投资者看来技术分析工具通常比较滞后、需要…

前置知识储备

基本认知 什么是模式 在一定环境中解决一些问题的方案&#xff08;通俗来说&#xff1a;特定环境中用固定的套路解决问题&#xff09; 什么是设计模式 设计模式是一套反复被人使用&#xff0c;多数人知晓的&#xff0c;经过分类编目的代码设计经验的总结 设计模式最终的目…

2024蓝桥杯CTF writeUP--缺失的数据

压缩包的内容 里面有secret.txt文件&#xff0c;用ARCHPR工具套上字典&#xff0c;爆破压缩包密码。密码为pavilion 解压得到原图&#xff0c;并且有了加密后的图片&#xff0c;根据代码里的key和参数直接运行脚本解密水印图片&#xff1a; import cv2 import numpy as np imp…

Linux随记(九)

一、在bclinux Euler 21.10 安装oracle19c客户端 &#xff08;为了使用sqlplus 、expdp、impdp、sqlldr等指令&#xff09; #环境和说明 系统&#xff1a;BigCloud Enterprise Linux For Euler 21.10 LTS 为了使用sqlplus 、expdp、impdp、sqlldr等指令。 下面是安装步骤 &…

【Golang】VSCode进行GO的调试

原来的launch.json {"version": "0.2.0","configurations": [{"name": "Golang","type": "go","request": "launch","program": "${workspaceFolder}","…

`DeferredResult`用法简单介绍

目录 简介案例 简介 DeferredResult是Spring Framework中用于处理异步请求的一个类&#xff0c;通常与Spring MVC的Controller一起使用。它允许控制器在请求处理完成后&#xff0c;异步地生成响应&#xff0c;而不必阻塞线程等待结果。这对于处理需要耗时的操作或长时间等待外…

CopyClip for Mac - 高效复制粘贴,轻松管理剪贴板

CopyClip for Mac&#xff0c;一款专为Mac用户打造的剪贴板管理工具&#xff0c;让你在复制粘贴的日常任务中&#xff0c;享受到前所未有的高效与便捷。 它常驻在菜单栏中&#xff0c;时刻准备为你服务。一旦你复制了内容&#xff0c;CopyClip就会自动将其保存至历史记录中&…

为什么Qt这么强大却不受欢迎?

在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「Qt的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;虽然这个问题并不被广泛讨论&#xff0c;但我根…

docker-compose安装es+kibana 8.12.2

小伙伴们&#xff0c;你们好&#xff0c;我是老寇&#xff0c;我又回来辣&#xff0c;几个月不见甚是想念啊&#xff01;&#xff01;&#xff01; 因云平台需要改造&#xff0c;es7升级为es8&#xff0c;所以记录一下&#xff0c;es8需要开启ssl认证&#xff0c;需要配置证书…

项目1:STM32+DHT11+FreeRTOS+emwin+LCD

【屏幕显示DHT11数据】 面向对象的思想编写硬件驱动程序&#xff0c;DHT11采集环境中的温湿度数据。使用FreeRTOS提供的任务间通信、同步、互斥&#xff0c;将DHT11的数据传递给显示任务。显示任务中&#xff0c;使用emWin中间件&#xff0c;制作屏幕的各种界面&#xff0c;并将…

基于零一万物多模态大模型通过外接数据方案优化图像文字抽取系统

大模型相关目录 大模型&#xff0c;包括部署微调prompt/Agent应用开发、知识库增强、数据库增强、知识图谱增强、自然语言处理、多模态等大模型应用开发内容 从0起步&#xff0c;扬帆起航。 大模型应用向开发路径&#xff1a;AI代理工作流大模型应用开发实用开源项目汇总大模…