您的位置:首页 > 其它

Leetcode 68. Text Justification

2016-05-02 07:10 169 查看


68. Text Justification

Total Accepted: 32775 Total
Submissions: 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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: