import java.util.ArrayList;
import java.util.Arrays;
import java.util.List; /**
*
* Source : https://oj.leetcode.com/problems/text-justification/
*
*
* 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.
*
*
* 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.
*/
public class TextJustification { /**
* 格式化给定的单词串,每行长度固定
*
* @param words
* @return
*/
public String[] justify (String[] words, int length) {
if (words.length < 1) {
return words;
}
if (words.length == 1) {
words[0] = words[0] + getSpace(length - words[0].length());
return words;
}
int gap = 0;
int lineLength = words[0].length();
List<String> result = new ArrayList<String>();
List<String> lineWords = new ArrayList<String>(){{add(words[0]);}};
int index = 1;
while (index < words.length) {
int sum = gap + lineLength + words[index].length();
if (sum >= length) {
result.add(buildLine(lineWords, gap, length - gap - lineLength));
gap = -1;
lineLength = 0;
lineWords.clear();
}
gap++;
lineLength += words[index].length();
lineWords.add(words[index]);
index ++;
// 最后一行
if (index == words.length) {
result.add(buildLine(lineWords, gap, length - gap - lineLength));
} }
return result.toArray(new String[result.size()]);
}
private String buildLine (List<String> words, int gap, int remain) {
if (words.size() == 1) {
return words.get(0) + getSpace(remain);
}
StringBuilder result = new StringBuilder();
for (int i = 0; i < words.size() - 1; i++) {
int spaceLen = 1 + remain / gap;
if (i < remain % gap) {
spaceLen ++;
}
result.append(words.get(i) + getSpace(spaceLen));
}
result.append(words.get(words.size()-1));
return result.toString();
} private String getSpace (int n) {
String space = "";
for (int i = 0; i < n; i++) {
space += " ";
}
return space;
} public static void main(String[] args) {
TextJustification textJustification = new TextJustification();
String[] words = new String[]{"This", "is", "an", "example", "of", "text", "justification."};
System.out.println(Arrays.toString(textJustification.justify(words, 16)));
} }

最新文章

  1. Oracle数据库习题
  2. Device.js – 快速检测平台、操作系统和方向信息
  3. 关于 0xCCCCCCCC
  4. bootstrap字体图标
  5. python学习笔记:python数字
  6. hadoop部署、启动全套过程
  7. poj 2229 DP
  8. Linux stat函数和stat命令
  9. PLsql快捷键
  10. 编程菜鸟的日记-初学尝试编程-C++ Primer Plus 第6章编程练习6
  11. docker 安装redis , 让宿主机可以访问
  12. Charles在Mac、iPhone、Android上抓http/https协议的包
  13. angularJs 2-quickstart学习记录
  14. requests库入门14-Cookie
  15. oracle中nvarchar2字符集不匹配
  16. HTML滚动文字代码 marquee标签
  17. .NetCore发布到Centos docker
  18. 比较 VGG, resnet和inception的图像分类效果
  19. MQ中将消息发送至远程队列的配置
  20. 52、图片缩放库 PhotoView

热门文章

  1. Mac- appium 环境配置
  2. 线程中的队列(queue)
  3. Unity跳转场景
  4. Breathe me
  5. IntelliJ IDEA的main方法,for循环,syso的快捷键
  6. ETC(电子不停车收费系统)的发展演变
  7. Converting Recursive Traversal to Iterator
  8. 阿里技术分享:阿里自研金融级数据库OceanBase的艰辛成长之路
  9. 腾迅云获取免费SSL证书并布置
  10. 小奶狗给小喵咪上CSS课程