leetcode 68. 文本左右对齐

题目链接:leetcode 68

1.题目

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

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

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

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

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

2.示例

1)示例 1:
输入: words = [“This”, “is”, “an”, “example”, “of”, “text”, “justification.”], maxWidth = 16
输出:
[
“This is an”,
“example of text”,
"justification. "
]

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

3)示例 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 "
]

3.分析

如何解决这个问题,我们主要要解决两部分子问题
问题1:每一行放哪几个单词
问题2:一行的单词该如何放置
为解决问题1,我们使用sum_length_words表示目前已经考虑要放的单词的长度总和,num_words表示要放的单词的个数,那么下一个单词不能放置的边界条件是sum_length_words+num_words(因为每2个单词之间至少需要1个空格)+当前单词长度>maxWidth
为解决问题2,我们考虑所有空格个数即为maxWidth-sum_length_words,若把连续的空格当为1段,那么空格段个数即为num_words-1,考虑把n个空格分给m段,当n%m=0时,每段空格的个数为n/m,当n%m!=0时,我们把最后1个空格段拥有的空格数设为n/m,再把(n-n/m)个空格分给(m-1)个空格段知道能平均分

4.代码

class Solution {
public:vector<int> get_kg(int sum_length_kg,int num_kg){int avg_kg=sum_length_kg/num_kg;vector<int> ans;for(int i=0;i<num_kg;i++)ans.push_back(0);if(sum_length_kg%num_kg==0){for(int i=0;i<num_kg;i++)ans[i]=avg_kg;return ans;}while(sum_length_kg%num_kg!=0){ans[num_kg-1]=sum_length_kg/num_kg;sum_length_kg-= ans[num_kg-1];num_kg--;if(sum_length_kg%num_kg==0){for(int i=0;i<num_kg;i++)ans[i]=sum_length_kg/num_kg;return ans;}}ans[0]=sum_length_kg;return ans;}vector<string> fullJustify(vector<string>& words, int maxWidth) {vector<string> ans;int n=words.size();int sum_length=0,cnt_words=0;for(int i=0;i<n;i++){if(sum_length+cnt_words+words[i].size()<=maxWidth){if(i==n-1){string ans_test="";sum_length=0;for(int j=i-cnt_words;j<i;j++){ans_test+=words[j]+' ';sum_length+=words[j].size()+1;}ans_test+=words[i]; sum_length+=words[i].size();  for(int j=0;j<maxWidth-sum_length;j++)ans_test+=' ';ans.push_back(ans_test);return ans;}sum_length+=words[i].size();cnt_words++;continue;}string ans_test="";int cnt_kg=0;if(cnt_words==1) cnt_kg=1;else cnt_kg=cnt_words-1;vector<int> num_kg_list=get_kg(maxWidth-sum_length,cnt_kg);for(int j=i-cnt_words;j<i;j++){ans_test+=words[j];if(j-(i-cnt_words)<num_kg_list.size()){int num_kg=num_kg_list[j-(i-cnt_words)];for(int k=0;k<num_kg;k++)ans_test+=' ';}}ans.push_back(ans_test);cnt_words=1;sum_length=words[i].size();if(i==n-1){ans_test=words[i];for(int j=0;j<maxWidth-words[i].size();j++)ans_test+=' ';ans.push_back(ans_test);return ans;}}return ans;}
};

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

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

相关文章

一段音频怎么做二维码?扫码播放音乐怎么做?

音频二维码主要是用来将一段音乐或者其他音频文件&#xff0c;以便用户可以通过扫码的方式来播放音频文件。那么音频二维码制作分几个步骤来完成&#xff0c;肯定有很多小伙伴非常的感兴趣&#xff0c;本篇文章就来给大家分享一下在线生成二维码的制作方法&#xff0c;在电脑的…

声音.wav文件的读取与保存

声音.wav文件的读取与保存-示例代码&#xff1a; import librosa import librosa.display import numpy as np from scipy.io.wavfile import writedef split_wav():# 读取音频文件audio_data, sample_rate librosa.load(input_file, srNone) # sr不指定为None&#xff0c;就…

Ubuntu 常用命令之 gunzip 命令用法介绍

&#x1f4d1;Linux/Ubuntu 常用命令归类整理 gunzip是一个在Ubuntu系统下用于解压缩文件的命令。它主要用于解压.gz格式的文件。这个命令是gzip命令的反向操作&#xff0c;gzip用于压缩文件&#xff0c;而gunzip则用于解压缩文件。 gunzip命令的参数有 -c 或 --stdout 或 -…

算法专题三:二分算法

二分法 零.二分查找1.思路一&#xff1a;朴素二分 一.在排序数组中第一个和最后一个数&#xff1a;1.思路一&#xff1a;GIF题目解析 二.算法X的平方根&#xff1a;1.思路一&#xff1a;暴力哈希2.思路二&#xff1a;二分区间GIF题目解析 三.搜索插入位置&#xff1a;1.思路一&…

中国防风固沙量数据

中国防风固沙量数据 防风固沙是生态系统&#xff08;如森林、草地等&#xff09;通过其结构与过程减少由于风蚀所导致的土壤侵蚀的作用&#xff0c;是生态系统提供的重要调节服务之一。防风固沙功能主要与风速、降雨、温度、土壤、地形和植被等因素密切相关。以防风固沙量&…

vue创建项目

1、配置node环境 Node.js 安装配置-----菜鸟教程 npm 使用介绍-----菜鸟教程 淘宝镜像 淘宝 NPM 镜像是一个完整 npmjs.org 镜像&#xff0c;你可以用此代替官方版本(只读)&#xff0c;同步频率目前为 10分钟 一次以保证尽量与官方服务同步。 可以使用淘宝定制的 cnpm (gzip …

21 Vue3中使用v-for遍历对象数组

概述 使用v-for遍历对象数组在真实的开发中也属于非常常见的用法&#xff0c;需要重点掌握。 因为目前流行的是前后端分离开发&#xff0c;在前后端分离开发中&#xff0c;最常需要处理的就是对象数组类型的数据了。 比如&#xff0c;将员工信息渲染到表格中。 这节课我们就…

3d max高质量渲染时,硬件的要求有什么?

渲染过程中&#xff0c;想要追求&#xff0c;效果图高质量渲染&#xff0c;高效率渲染的过程中&#xff0c;3d max高清渲染不只是三维软件的一个要求&#xff0c;对于本地计算机的硬件要求配置也是很重要的。 今天&#xff0c;小编带大家来聊聊3d max高质量渲染过程中&#xff…

solidity 重入漏洞

目录 1. 重入漏洞的原理 2. 重入漏洞的场景 2.1 msg.sender.call 转账 2.2 修饰器中调用地址可控的函数 1. 重入漏洞的原理 重入漏洞产生的条件&#xff1a; 合约之间可以进行相互间的外部调用 恶意合约 B 调用了合约 A 中的 public funcA 函数&#xff0c;在函数 funcA…

使用 Node.js 删除文件 - 完整步骤教程

引言 在 Node.js 中处理文件尤其是移除文件&#xff0c;对于维护高效应用程序至关重要。储存和秩序当道的今天&#xff0c;删除不必要或冗余的文件能力显得尤为关键。本文深入探讨你会想要使用这个强大功能的时刻和原因&#xff0c;并通过各种案例展示了这个概念&#xff0c;同…

【C#】.net core 6.0 通过依赖注入注册和使用上下文服务

给自己一个目标&#xff0c;然后坚持一段时间&#xff0c;总会有收获和感悟&#xff01; 请求上下文是指在 Web 应用程序中处理请求时&#xff0c;包含有关当前请求的各种信息的对象。这些信息包括请求的头部、身体、查询字符串、路由数据、用户身份验证信息以及其他与请求相关…

案例系列:营销模型_客户细分_无监督聚类

案例系列&#xff1a;营销模型_客户细分_无监督聚类 import numpy as np # 线性代数库 import pandas as pd # 数据处理库&#xff0c;CSV文件的输入输出&#xff08;例如pd.read_csv&#xff09;/kaggle/input/customer-personality-analysis/marketing_campaign.csv在这个项…

KoPA: Making Large Language Models Perform Better in Knowledge Graph Completion

本来这个论文用来组会讲的&#xff0c;但是冲突了&#xff0c;没怎么讲&#xff0c;记录一下供以后学习。 创新点 按照我的理解简单概述一下这篇论文的创新点 提出使用大模型补全知识图谱&#xff0c;并且融合知识图谱的结构信息提出一个新的模型KoPA模型&#xff0c;采用少…

JavaCV音视频开发宝典:UDP局域网组播推流,多播推流,局域网多网段推流,使用UDP方式推送TS组播流,实现UDP一对多组播

《JavaCV音视频开发宝典》专栏目录导航 《JavaCV音视频开发宝典》专栏介绍和目录 ​ 前言 在之前文章中我们已经实现rtp点到点传输JavaCV音视频开发宝典:rtp点到点音视频传输(一对一音视频直播)和rtp广播JavaCV音视频开发宝典:rtp广播方式发送TS流音视频传输(一对多音视…

Linux宝塔面板本地部署Discuz论坛发布到公网访问【无需公网IP】

文章目录 前言1.安装基础环境2.一键部署Discuz3.安装cpolar工具4.配置域名访问Discuz5.固定域名公网地址6.配置Discuz论坛 前言 Crossday Discuz! Board&#xff08;以下简称 Discuz!&#xff09;是一套通用的社区论坛软件系统&#xff0c;用户可以在不需要任何编程的基础上&a…

算法训练营Day23(二叉树)

669. 修剪二叉搜索树 669. 修剪二叉搜索树 - 力扣&#xff08;LeetCode&#xff09; 这里本身不难&#xff0c;更多的是递归的技巧&#xff0c;在脑子里模拟一遍递归逻辑&#xff0c;记忆好模板就好了。 class Solution {public TreeNode trimBST(TreeNode root, int low, int…

uni-app学习记录

uni-app官网学习记录 uni-app注意点记录 页面跳转注意事项 navigateTo, redirectTo 只能打开非 tabBar 页面。switchTab 只能打开 tabBar 页面。reLaunch 可以打开任意页面。不能在首页 onReady 之前进行页面跳转。 页面通讯 // 发起页面uni.$emit(update,{msg:页面更新})//…

软件设计模式:六大设计原则

文章目录 前言一、开闭原则二、里氏替换原则三、依赖倒转原则四、接口隔离五、迪米特法则六、合成复用原则总结 前言 在软件开发中&#xff0c;为了提高软件系统的可维护性和可复用性&#xff0c;增加软件的可扩展性和灵活性&#xff0c;程序员要尽量根据6条原则来开发程序&am…

爬虫scrapy中间件的使用

爬虫scrapy中间件的使用 学习目标&#xff1a; 应用 scrapy中使用间件使用随机UA的方法应用 scrapy中使用代理ip的的方法应用 scrapy与selenium配合使用 1. scrapy中间件的分类和作用 1.1 scrapy中间件的分类 根据scrapy运行流程中所在位置不同分为&#xff1a; 下载中间件…

idea好用的十个插件分享,用后敲代码的速度提升好几倍,亲测有效

简介&#xff1a; 在日常的开发工作中&#xff0c;我发现了一些非常实用的 IntelliJ IDEA 插件&#xff0c;它们能够显著提升开发效率&#xff0c;让编码变得更加轻松愉快。今天&#xff0c;我想分享给大家我的个人推荐&#xff0c;希望对你的开发工作有所帮助&#xff01; L…