题目

Given an array of words and a length L, format the text such that each line has exactly L characters and is fully (left and right) justified.

You should pack your words in a greedy approach; that is, pack as many words as you can in each line. Pad extra spaces ' ' when necessary so that each line has exactly L characters.

Extra spaces between words should be distributed as evenly as possible.
If the number of spaces on a line do not divide evenly between words,
the empty slots on the left will be assigned more spaces than the slots
on the right.

For the last line of text, it should be left justified and no extra space is inserted between words.

For example,
words: ["This", "is", "an", "example", "of", "text", "justification."]
L: 16.

Return the formatted lines as:

[
"This is an",
"example of text",
"justification. "
]

Note: Each word is guaranteed not to exceed L in length.

click to show corner cases.

Corner Cases:

  • A line other than the last line might contain only one word. What should you do in this case?
    In this case, that line should be left-justified.

题解:

下面讲解引用自Code Ganker(http://blog.csdn.net/linhuanmars/article/details/24063271),代码部分我用注释都解释了下。

“这
道题属于纯粹的字符串操作,要把一串单词安排成多行限定长度的字符串。主要难点在于空格的安排,首先每个单词之间必须有空格隔开,而当当前行放不下更多的
单词并且字符又不能填满长度L时,我们要把空格均匀的填充在单词之间。如果剩余的空格量刚好是间隔倍数那么就均匀分配即可,否则还必须把多的一个空格放到
前面的间隔里面。实现中我们维护一个count计数记录当前长度,超过之后我们计算共同的空格量以及多出一个的空格量,然后将当行字符串构造出来。最后一
个细节就是最后一行不需要均匀分配空格,句尾留空就可以,所以要单独处理一下。时间上我们需要扫描单词一遍,然后在找到行尾的时候在扫描一遍当前行的单
词,不过总体每个单词不会被访问超过两遍,所以总体时间复杂度是O(n)。而空间复杂度则是结果的大小(跟单词数量和长度有关,不能准确定义,如果知道最
后行数r,则是O(r*L))。代码如下:”

代码如下:

 1 public ArrayList<String> fullJustify(String[] words, int L) {
 2     ArrayList<String> res = new ArrayList<String>();
 3     if(words==null || words.length==0)
 4         return res;
 5     int count = 0;
 6     int last = 0;
 7     for(int i=0;i<words.length;i++){
 8         //count是上一次计算的单词的长度,words[i].length()是当前尝试放的一个单词的长度,
 9         //假设当前放上了这个单词,那么这一行单词跟单词间的间隔数就是i-last
         //判断这些总的长度加起来是不是大于L(超行数了)
         if(count + words[i].length() + (i-last) > L){
             int spaceNum = 0;
             int extraNum = 0;
             //因为尝试的words[i]失败了,所以间隔数减1.此时判断剩余的间隔数是否大于0
             if( i-last-1 >0){
                 //是间隔的倍数(为啥要减1,因为尝试当前words[i]后发现比L长了,
                 //所以当前这个单词不能算作这行,所以间隔就减少一个
                 spaceNum = (L-count)/(i-last-1);
                 extraNum = (L-count)%(i-last-1);//不是倍数的话还要计算
             }
             StringBuilder str = new StringBuilder();
             for(int j=last;j<i;j++){
                 str.append(words[j]);
                 if(j<i-1){//words[i-1]的话后面就不用填空格了,所以这里j<i-1
                     for(int k=0;k<spaceNum;k++)
                         str.append(" ");
                     
                     if(extraNum>0)
                         str.append(" ");
                     
                     extraNum--;
                 }
             }
             
             //下面这个for循环作用于一行只有一个单词还没填满一行的情况
             for(int j=str.length();j<L;j++)
                 str.append(" ");
                 
             res.add(str.toString());
             count=0;
             last=i;//下一个开始的单词
         }
         count += words[i].length();
     }
     
     //处理最后一行
     StringBuilder str = new StringBuilder();
     for(int i=last;i<words.length;i++){
         str.append(words[i]);
         if(str.length()<L)
             str.append(" ");
     }
     for(int i=str.length();i<L;i++)
         str.append(" ");
     
     res.add(str.toString());
     return res;
 }

Reference:

http://blog.csdn.net/linhuanmars/article/details/24063271

Text Justification leetcode java的更多相关文章

  1. Text Justification [LeetCode]

    Problem Description:http://oj.leetcode.com/problems/text-justification/ Note: Just be careful about ...

  2. Java for LeetCode 068 Text Justification

    Given an array of words and a length L, format the text such that each line has exactly L characters ...

  3. [LeetCode] 68. Text Justification 文本对齐

    Given an array of words and a length L, format the text such that each line has exactly L characters ...

  4. [LeetCode] Text Justification 文本左右对齐

    Given an array of words and a length L, format the text such that each line has exactly L characters ...

  5. leetcode@ [68] Text Justification (String Manipulation)

    https://leetcode.com/problems/text-justification/ Given an array of words and a length L, format the ...

  6. 【一天一道LeetCode】#68. Text Justification

    一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Given a ...

  7. [leetcode]Text Justification @ Python

    原题地址:https://oj.leetcode.com/problems/text-justification/ 题意: Given an array of words and a length L ...

  8. LeetCode: Text Justification 解题报告

    Text Justification Given an array of words and a length L, format the text such that each line has e ...

  9. LeetCode OJ——Text Justification

    http://oj.leetcode.com/problems/text-justification/ 编译代码要看warnings!它提供了可能出问题的情况,比如类型转换上unsigned int ...

随机推荐

  1. zk节点扩充

    zk节点扩充,从3个节点扩充为7个节点,需要先安装4个节点,在将4个节点的配置进行修改,然后在修改 原有的3个节点.至此完成对zk的扩充实现,在此做个记录. zk节点的顺序,与对应zk与所在序列保持一 ...

  2. faker php测试数据库生成

    官方地址:https://github.com/fzaninotto/Faker 使用方式: 1.composer直接下载: composer require fzaninotto/faker 2.将 ...

  3. hdu 3289 最大独立集

    题意:一个动物园里有N只猫和K只狗,一些小朋友来参观,他们如果喜欢狗就不喜欢猫,喜欢猫就不喜欢狗,园长想要移走一些动物,如果,移走的是某个小朋友不喜欢的,而喜欢的没被移走,该小朋友就会高兴,求移动的数 ...

  4. Centos7 安装 ActiveMQ 5.15.1

    环境 [root@node1 ~]# cat /etc/redhat-release CentOS Linux release (Core) [root@node1 ~]# uname -r -.el ...

  5. RabbitMQ安装以及集群部署

    本次记录安装RabbitMQ的过程,只针对MAC下单机版安装.单机集群安装方法以及配置haproxy负载均衡. RabbitMQ单机版本安装 RabbitMQ单机集群安装方法(适合开发练习) Rabb ...

  6. 使用 IntraWeb (5) - 页面布局之 TFrame

    IW 对 TFrame(还是之前那个), 这在页面布局中很有用. 如果多个页面都有一个共同的部分(譬如页眉.页脚.菜单.边栏等), 可以将这些共同的部分放在一个 TFrame 中, 从而方便统一与修改 ...

  7. java将文件打包成ZIP压缩文件的工具类实例

    package com.lanp; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import ja ...

  8. [原创]App性能测试指标篇

    [原创]App性能测试指标篇 目前由于苹果,三星等大厂对智能手机的研发及投入,使的智能手机发展非常迅速,每个人手中都有一些离不开生活的App,如:微信,微博,百度或是各游戏App等,但是到底App性能 ...

  9. Go语言基础:method

    我们在C语言中,struct中声明函数,而Go中则不能再struct中声明函数.而是采用另外一种形态存在,Go中叫method. method的概念 method是附属在一个给定的类型上,语法和函数的 ...

  10. 【Go命令教程】8. go test

    go test 命令用于对 Go 语言编写的程序进行测试.这种测试是以 代码包 为单位的.当然,这还需要测试源码文件的帮助.关于怎样编写并写好 Go 程序测试代码,我们会在本章的第二节加以详述.在这里 ...