1. 首页

068. 文本左右对齐

题目描述:

难度:Hard

相关话题:字符串

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

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

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

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

说明:

  • 单词是指由非空格字符组成的字符序列。

  • 每个单词的长度大于 0,小于等于maxWidth

  • 输入单词数组 words 至少包含一个单词。

示例:

输入:
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         "
]

Js中文网 – 前端进阶资源教程 www.javascriptC.com,typescript 中文文档
Javascript中文网是以前端进阶资源教程分享为主的专业网站,包括:前端、大厂面试题、typescript教程、程序人生、React.js……等,以帮助开发者成长为愿景的社区


思路:

一行一行的算,对于每一行,先计算出当前行能装的单词的数量k

由于第一个单词前面不需要空格,定义tmp为当前行的第一个单词words[i]

通过变量j遍历0k-1,之后每一个单词就是words[i+j+1]

如果当前行是最后一行,那么每个单词间隔就只是1个空格;

如果当前行不是最后一行,那么需要计算每个单词的间隔,(maxWidth-len)/(k-1)表示当前空格的总长度平均分的间隔,
(maxWidth-len)%(k-1)表示平均分后还剩下的空格长度,剩下的这些长度时需要从头开始,每个单词之间的间隔+1

如果当前遍历的索引j<(maxWidth-len)%(k-1),说明当前索引j对应的单词是需要间隔+1的。

遍历结束后,如果末尾还有位置就添加空格填满。(例如最后一行或者一行只有1个长单词,但这个单词又不够填满的情况)

/**
 * @来源: Javascript中文网 - 前端进阶资源教程 https://www.javascriptc.com/
 * @介绍:一个致力于帮助开发者用代码改变世界为使命的平台,每天都可以在这里找到技术世界的头条内容
 * @param {string[]} words
 * @param {number} maxWidth
 * @return {string[]}
 */
var fullJustify = function(words, maxWidth) {
  let res=[],N=words.length
  for(let i=0,k;i<N;i+=k) {
    let len=0
    for(k=0; i+k < N && len+words[i+k].length <= maxWidth-k;k++) {
      len += words[i+k].length
    }
    let tmp = words[i];
    for(let j=0;j<k-1;j++) {
      if(i+k>=N) tmp += " "
      else tmp +=' '.repeat((maxWidth-len)/(k-1) + ((j<(maxWidth-len)%(k-1)) ? 1 : 0))
      tmp += words[i+j+1]
    }
    tmp +=' '.repeat(maxWidth-tmp.length)
    res.push(tmp)
  }
  return res
};

看完两件小事

如果你觉得这篇文章对你挺有启发,我想请你帮我两个小忙:

  1. 关注我们的 GitHub 博客,让我们成为长期关系
  2. 把这篇文章分享给你的朋友 / 交流群,让更多的人看到,一起进步,一起成长!
  3. 关注公众号 「画漫画的程序员」,公众号后台回复「资源」 免费领取我精心整理的前端进阶资源教程

JS中文网是中国领先的新一代开发者社区和专业的技术媒体,一个帮助开发者成长的社区,目前已经覆盖和服务了超过 300 万开发者,你每天都可以在这里找到技术世界的头条内容。欢迎热爱技术的你一起加入交流与学习,JS中文网的使命是帮助开发者用代码改变世界

本文著作权归作者所有,如若转载,请注明出处

转载请注明:文章转载自「 Js中文网 · 前端进阶资源教程 」https://www.javascriptc.com

标题:068. 文本左右对齐

链接:https://www.javascriptc.com/4428.html

« 第5篇-VNode节点(Vue.js实现) | Vue.js源码系列
067. 二进制求和»
Flutter 中文教程资源

相关推荐

QR code