
2020102-canvas.png
本題雖說是個困難級別的題,但是如果看懂了給的樣例,還是非常好實現(xiàn)的。
這道題其實能說的點不多,就是完全模擬
題目提到了很關(guān)鍵的一點:
[盡可能多地往每行中放置單詞],為了滿足每行多放,那么就讓每行的單詞之間僅有一個空格,看看能放置幾個單詞
第二個關(guān)鍵點:每行的能放置的單詞確認(rèn)完后,就要考慮空格如何分配。比如 [This is an],這三個單詞,起初至少要保證單詞有一個空格,那么這三個單詞間就至少有兩個空格,這兩個空格作為我們 再分配 空格的基礎(chǔ)條件。
maxWidth = 16, 16 - 8 = 8(考慮這三個單詞本身的長度,最多可分配8個空格),8 / 2 = 4, 因此沒兩個單詞之間可分配四個空格。
具體邏輯參見代碼。
public List<String> fullJustify(String[] words, int maxWidth) {
int i = 0, len = words.length;
List<String> res = new ArrayList<>();
while(i < len) {
//一行中最少能放置一個單詞
int left = i;//沒行單詞的起點
int curLen = words[i].length();
i++;
while(i < len) {
//每一行盡可能容納多的單詞,所以單詞間的空格數(shù)至少是1
int l2 = words[i].length();
if(curLen + l2 + 1 > maxWidth)
break;
curLen += l2 + 1;
i++;
}
StringBuilder sb = new StringBuilder();
if(i == len) {
for(int j = left; j < i; j++) {
sb.append(words[j] +" ");
}
int l2 = sb.length();
sb.deleteCharAt(l2 - 1);
for(int j = sb.length(); j < maxWidth; j++) {
sb.append(" ");
}
res.add(sb.toString());
break;
}
//嘗試為單詞間分配空格
int all_words_len = 0;
for(int j = left; j < i; j++) {
all_words_len += words[j].length();
}
//最少需要幾個空格
int low_space = i - left - 1;
int can_space = maxWidth - all_words_len;
int real_space = 0, b = 0;
//這個判斷是考慮 如果最后一行只放一個單詞的話
if(low_space != 0) {
real_space = can_space / low_space;
b = can_space % low_space;
}
for(int j = left; j < i; j++) {
if(sb.length() > 0) {
for(int k = 0; k < real_space; k++)
sb.append(" ");
if(b != 0) {
sb.append(" ");
b--;
}
}
sb.append(words[j]);
}
for(int j = sb.length(); j < maxWidth; j++) {
sb.append(" ");
}
res.add(sb.toString());
}
return res;
}