Leetcode 68. Text Justification
2016-05-02 07:10
169 查看
68. Text Justification
Total Accepted: 32775 TotalSubmissions: 202667 Difficulty: Hard
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 Lcharacters.
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.
吐槽1:巨trivial的一道题,其实不难,就是考耐心和细节,又花了俩小时。。
吐槽2:一开始花了很久写的代码,结果有bug,然后改了出现死循环,刷新页面发现代码没了(卧槽),还好很仔细想过之后再写就快很多,猜大概这就是自己仔细过一遍思路的好处。
思路:
每次maxWidth都要减去当前单词的长度,再减一。这是找每一行。跳出条件为i超出数组元素,或者当前行位置已经不足。
自己维护两个变量, start和end来判断当前这行的开始单词和结束单词。并根据这两个元素来判断有多少个间隔。
还需要注意的地方有两个:
1. 比如这行有6个空格,4个间隔,那么左1,左2的空格长度为2。这个自己是取模然后作为remain传递,这样知道补几次extra space。
2. 最后一行如果有两个以上单词,则间隔为1,在末尾补空格。
public class Solution { public List<String> fullJustify(String[] words, int maxWidth) { List<String> res = new ArrayList<String>(); if(words == null || words.length==0){ res.add(""); return res; } int i = 0; while(true){ int c1 = maxWidth; int wordLen = 0; int start = i; while(i<=words.length-1 && c1>=words[i].length()){ wordLen += words[i].length(); c1=c1-words[i++].length(); c1--; } int end = i-1; if(i!=words.length){ // c1 < next word length if(end==start){ placeRes(res, words, start, end, 0, maxWidth - wordLen); continue; } int space = (maxWidth - wordLen)/(end - start); placeRes(res, words, start, end, (maxWidth - wordLen)%(end - start), space); }else{ // last line if(end==start){ // one word placeRes(res, words, start, end, 0, maxWidth - wordLen); }else{ // "shall be. " StringBuilder sb = new StringBuilder(maxWidth); for(; start<end; start++){ sb.append(words[start]); sb.append(' '); } sb.append(words[start]); while(sb.length()!=maxWidth) sb.append(' '); res.add(sb.toString()); } return res; } } } void placeRes(List<String> res, String[] words, int start, int end, int remain, int spaceLen){ StringBuilder sb = new StringBuilder(); sb.append(words[start]); if(end==start){ while(spaceLen>0){ sb.append(' '); spaceLen--; } res.add(sb.toString()); return; } for(int i=start+1; i<=end; i++){ for(int j=0; j<spaceLen; j++) sb.append(' '); if(remain-->0) sb.append(' '); sb.append(words[i]); } res.add(sb.toString()); return; } }
相关文章推荐
- 【Unity】10.3 创建类人动画角色
- 【Unity】10.2 通用动画的导入和设置
- 多进程
- 【Unity】10.1 类人动画的导入和设置
- LeetCode 69. Sqrt(x)
- 【Unity】第10章 Mecanim动画系统
- centos7安装apue.3e时出错处理
- 在Linux以及Mac OS X启用F#
- 玩玩Xamarin Evolve 2016带来的新特性(三)-Xamarin Workbooks
- 【Unity】9.3 粒子系统生成器详解
- [备忘]RPM的查询功能
- 易經大意 321_340
- 咸蛋黄什锦炒饭的做法
- 【Unity】9.2 如何添加粒子组件
- [iOS]关于视频方向的若干问题
- 【Unity】9.1 导入粒子系统组件
- 【Unity】第9章 粒子系统
- LeetCode 244. Shortest Word Distance II
- SQL数据库语言总结及代码示例
- vs2012+cuda7.5+win8.1配置