力扣:68. 文本左右对齐(Python3)

题目:

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

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

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

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

注意:

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

来源:力扣(LeetCode)
链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

示例:

示例 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个空格,当单词间空格数不一致时,只有可能前部空格数比后部空格数多1即空格数之间的差的绝对值不可能大于1。

创建空列表result用来存放结果,初始化r为空字符串,用来表示每行内容即存入result的每个元素。

遍历words,分为2种情况,r是否为空,因为r为空时,只需要存入单词(word);当r不为空时,在存放前还要存入空格。接下来分类讨论。

当r为空时,r = word,如果遇到最后1个单词,那么最后1个单词单独成行,行末用空格填充即向result中直接添加word + ' ' * (maxWidth - len(word))。

当r不为空时,分为3种情况,分别是len(r) + 1 + len(word) < maxWidth、len(r) + 1 + len(word) == maxWidth、len(r) + 1 + len(word) > maxWidth即加上当前单词仍然不满maxWidth、加上当前单词正好maxWidth、加上当前单词超过maxWidth。“+1”的含义是算上前后单词间的空格,因为单词间至少需要1个空格,先按1个算,后期(需要换行的时候)再调整。需要分类讨论的原因是对应操作不一样。当不满maxWidth时,直接向r添加就好;当正好maxWidth时,添加后需要加入result,r重置为空;当超过maxWidth时,需要先在单词间填充空格,然后添加到result,再把单词赋值给r。接下来具体分类讨论。

当不满maxWidth时,在r后面添加' ' + word,如果当前是最后1个单词,还需要考虑行末空格填充即直接向result中添加(t := r + ' ' + word) + ' ' * (maxWidth - len(t))。

当正好maxWidth时,直接向result中添加r + ' ' + word,然后r重置为空。

当超过maxWidth时,说明需要换行,先对当前r整理。如果r中只有1个单词,那比较简单,注意行末空格填充即直接向result中添加r + ' ' * (maxWidth - len(r))。如果不止1个单词,需要调整单词间空格数。设total为需要调整的总空格数,用maxWidth-单词总长度-单词间的1个空格计算得到即total = (maxWidth - len(''.join(r.split())) - (len(r.split()) - 1))。设space为平均每个单词间需要多加入的空格即space = total // (len(r.split()) - 1),因为是平均出来的,向下取整,所以还会有剩下的空格,更新total:total %= (len(r.split()) - 1),这些空格逐个从前往后填入单词间。定义row为调整后的行,初始化为r中第1个单词即r.split()[0],然后从r中第2个单词遍历到尾,逐个添加到row中以及调整单词间的空格,重点在于空格,空格数等于1+space+1/0,如果有剩下的,最后就+1,如果没有剩下的,就+0即' ' * (1 + space + (t2 := min(1, total))),然后更新total:total -= t2。遍历完后,把row添加到result。到此换行的整理结束,然后把当前单词赋值给r,如果当前是最后1个单词,注意行末空格填充即直接向result中添加word + ' ' * (maxWidth - len(word))。

知识点:

1.min(arg1, arg2, *args, *[, key=func]):获取最小值。arg1, arg2, *args:参数值,可输入多个参数,比较必须大于2个参数进行比较否则报错。key:其为一个函数,用来指定取最小值的方法。 

2.关于*:可以用来表示重复(复制)的意思,比如list = [0] * 10,表示创建10个0的列表。

代码:

class Solution:def fullJustify(self, words: List[str], maxWidth: int) -> List[str]:result = []r = ''for index, word in enumerate(words):if len(r) == 0:  # 每行第1个if index != len(words) - 1:r = wordelse:  # 最后1个单词单独成行result.append(word + ' ' * (maxWidth - len(word)))else:if len(r) + 1 + len(word) < maxWidth:if index != len(words) - 1:r += ' ' + wordelse:  # 最后1行result.append((t := r + ' ' + word) + ' ' * (maxWidth - len(t)))elif len(r) + 1 + len(word) == maxWidth:if index != len(words) - 1:result.append(r + ' ' + word)r = ''else:  # 最后1行result.append(r + ' ' + word)else:  # 需要换行if len(r.split()) == 1:  # 1行只有1个单词result.append(r + ' ' * (maxWidth - len(r)))else:total = (maxWidth - len(''.join(r.split())) - (len(r.split()) - 1))space = total // (len(r.split()) - 1)total %= (len(r.split()) - 1)row = r.split()[0]for idx in range(1, len(r.split())):row += ' ' * (1 + space + (t2 := min(1, total))) + r.split()[idx]total -= t2result.append(row)if index == len(words) - 1:  # 最后1个单词单独成行result.append(word + ' ' * (maxWidth - len(word)))else:r = wordreturn result

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

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

相关文章

十八、深度学习模型30年演化史

1、模型分类 深度学习是解决问题的一系列模型与方法,但深度学习模型不是深度学习领域中唯一的研究方向,且不一定是最重要的研究方向。除了模型之外,比较重要的还有优化算法、损失函数、采样方法等。 1.1 DNN 深度神经网络(Deep Neural Networks, 以下简称DNN)是…

四、pikachu之文件包含

文章目录 1、文件包含漏洞概述1.1 文件包含漏洞1.2 相关函数1.3 文件包含漏洞分类 2、File Inclusion(local)3、File Inclusion(remote) 1、文件包含漏洞概述 1.1 文件包含漏洞 文件包含漏洞&#xff1a;在web后台开发中&#xff0c;程序员往往为了提高效率以及让代码看起来更…

优化时间流:区间调度问题的探索与解决

在浩如烟海的信息时代&#xff0c;时间的有效管理成为了一门不可或缺的艺术。无论是生活中的琐事&#xff0c;还是工作中的任务&#xff0c;时间都在无声地流逝&#xff0c;挑战着我们的智慧。正如时间在日常生活中具有的宝贵价值一样&#xff0c;在计算机科学领域&#xff0c;…

Java 并发编程

概念&#xff1a; 进程&#xff1a;运行中的程序&#xff1b;操作系统会给这个程序分配一定的资源&#xff08;占用内存资源&#xff09;&#xff1b; 线程&#xff1a;线程是 CPU 调度的基本单位&#xff0c;每个线程执行的都是某一个进程的代码的某个片段&#xff1b; 明确线…

算法题-螺丝与螺母匹配 - Python

螺丝与螺母匹配 问题描述&#xff1a; 给你2堆大小不同的螺丝与螺母&#xff0c;螺丝与螺母是相互匹配的&#xff0c;但是螺丝与螺丝之间&#xff0c;螺母与螺母之间不能直接对比&#xff0c;仅仅螺丝与螺母进行对比&#xff0c;请设计一个分治算法实现。 示例: 输入&#xf…

C++ Primer 第1章 开始

C Primer 第1章 开始 1.1 编写一个简单的C程序1.1.1 编译、运行程序一、程序源文件命名约定二、从命令行运行编译器 练习 1.2 初识输入输出一、标准输入输出对象二、一个使用IO库的程序三、向流写入数据四、使用标准库中的名字五、从流读取数据六、完成程序 1.3 注释简介一、C中…

SpringSecurity原理

最近在研究SpringSecurity&#xff0c;肝了好多天&#xff0c;算是有点收获&#xff0c;在这里分享下 SpringSecurity是什么&#xff1f; SpringSecurity是一个强大的可高度定制的认证和授权框架&#xff0c;对于Spring应用来说它是一套Web安全标准。SpringSecurity注重于为J…

nginx-location正则

一 Nginx的location语法 location [||*|^~] /uri/ { … } 严格匹配。如果请求匹配这个location&#xff0c;那么将停止搜索并立即处理此请求~ 区分大小写匹配(可用正则表达式)~* 不区分大小写匹配(可用正则表达式)!~ 区分大小写不匹配!~* 不区分大小写不匹配^~ 如果把这个前缀…

word文件怎么免费转换为pdf格式?

大家在编辑word文件的时候&#xff0c;可能需要进行格式的转换&#xff0c;比如将word转换为pdf格式这时候需要使用工具软件。接下来小编就给大家介绍word文件怎么免费转换为pdf格式&#xff0c;免费word转pdf格式的方法。 免费word转pdf格式的方法 我们需要在电脑中安装并打开…

SpringCloud学习笔记(三)_服务提供者集群与服务发现Discovery

服务提供者集群 既然SpringCloud的是微服务结构&#xff0c;那么对于同一种服务&#xff0c;当然不可能只有一个节点&#xff0c;需要部署多个节点 架构图如下&#xff1a; 由上可以看出存在多个同一种服务提供者&#xff08;Service Provider&#xff09; 搭建服务提供者集…

第 7 章 排序算法(5)(希尔排序)

7.8希尔排序 7.8.1简单插入排序存在的问题 我们看简单的插入排序可能存在的问题. 数组 arr {2,3,4,5,6,1} 这时需要插入的数 1(最小), 这样的过程是&#xff1a; {2,3,4,5,6,6} {2,3,4,5,5,6} {2,3,4,4,5,6} {2,3,3,4,5,6} {2,2,3,4,5,6} {1,2,3,4,5,6} 结论: 当需要插入的数…

Spring Boot整合RabbitMQ之发布与订阅模式

RabbitMQ的模式中&#xff0c;常用的模式有&#xff1a;简单模式&#xff0c;发布与订阅模式&#xff0c;工作模式&#xff0c;路由模式&#xff0c;主题模式。简单模式不太会运用到工作中&#xff0c;我们可以使用 RabbitMQ 的发布订阅模式&#xff0c;实现&#xff1a; 用户…

Go语言进阶:函数、指针、错误处理

一、函数 函数是基本的代码块&#xff0c;用于执行一个任务。 Go 语言最少有个 main() 函数。 你可以通过函数来划分不同功能&#xff0c;逻辑上每个函数执行的是指定的任务。 函数声明包括函数名﹑形式参数列表﹑返回值列表&#xff08;可省略&#xff09;以及函数体。 fun…

微信小程序教学系列(7)

第七章&#xff1a;小程序安全和权限管理 第一节&#xff1a;小程序安全性保障 在开发小程序时&#xff0c;我们要时刻牢记小程序的安全性。毕竟&#xff0c;我们可不希望我们的小程序被黑客入侵或者用户的隐私被泄露。所以&#xff0c;让我们一起来了解一下如何保障小程序的…

android cocoscreator 检测模拟器还是真机

转载至 一行代码帮你检测Android模拟器 具体原理看原博主文章&#xff0c;这里只讲cocoscreator3.6的安卓工程怎么使用 1.新建一个com.lahm.library包&#xff0c;和com.cocos.game同目录&#xff0c;如图示 那四个文件的代码如下&#xff1a; EmulatorCheckUtil类&#…

mysql、oracle、sqlserver常见方法区分

整理了包括字符串与日期互转、字符串与数字互转、多行合并为一行、拼接字段等一些常用的函数&#xff0c;当然有些功能实现的方法不止一种&#xff0c;这里列举了部分常用的&#xff0c;后续会持续补充。 MySQLOracleSQL Server字符串转数字 CAST(123 as SIGNED) 或 CONVERT(12…

http请求中 Content-Type 的类别有哪些?

HTTP请求中的Content-Type字段用于指定请求体的格式类型。常见的Content-Type类型有以下几种&#xff1a; application/x-www-form-urlencoded&#xff1a;这是默认的格式&#xff0c;用于简单的表单数据传输。在发送表单数据时&#xff0c;如果使用GET方法&#xff0c;则需要…

【Unity】制作一个简单的菜单栏页面并实现其功能

这是一个简单的菜单页面制作&#xff0c;接下来我们将制作一个完整的菜单页面&#xff0c;并且通过一定的代码去实现它对应的效果。这个主要的功能就是我们在游戏中如果想暂停一下或者重新开始&#xff0c;那么就要用到我们这个功能。接下来我们将实现在游戏中按ESC退出键可以调…

Linux Kernel的local_irq_enable()和local_irq_disable()函数

代码如下图所示&#xff0c;最终操作的是msr daifset, #3 和 msr daifclr, #3 寄存器。 (include/linux/irqflags.h) #define local_irq_enable() do { raw_local_irq_enable(); } while (0) #define local_irq_disable() do { raw_local_irq_disable(); } while (0)#define ra…

解决SEGGER Embedded Studio无法显示Nordic MCU外设寄存器问题

如果使用SES调试NRF52840的时候发现&#xff0c;官方例程只能显示CPU寄存器&#xff0c;但是无法显示外设寄存器时&#xff0c;解决办法如下&#xff1a; 1.在解决方案右键→Options→Debug→Debugger&#xff0c;然后Target Device选择正确的型号。 2.Register Definition Fil…