Leetcode-68. 文本左右對齊,模擬好題,訓(xùn)練硬編碼能力

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;
    }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容