• Leetcode 68.文本左右对齐


    文本左右对齐

    给定一个单词数组和一个长度 maxWidth,重新排版单词,使其成为每行恰好有 maxWidth 个字符,且左右两端对齐的文本。

    你应该使用"贪心算法"来放置给定的单词;也就是说,尽可能多地往每行中放置单词。必要时可用空格 ' ' 填充,使得每行恰好有 maxWidth 个字符。

    要求尽可能均匀分配单词间的空格数量。如果某一行单词间的空格不能均匀分配,则左侧放置的空格数要多于右侧的空格数。

    文本的最后一行应为左对齐,且单词之间不插入额外的空格。

    说明:

    • 单词是指由非空格字符组成的字符序列。
    • 每个单词的长度大于 0,小于等于 maxWidth
    • 输入单词数组 words 至少包含一个单词。

    示例:

    输入:

    words = ["This", "is", "an", "example", "of", "text", "justification."]

    maxWidth = 16

    输出:

    [

       "This    is    an",

       "example  of text",

       "justification.  "

    ]

     1 import java.util.*;
     2 
     3 public class Solution {
     4     public ArrayList<String> fullJustify(String[] words, int maxWidth) {
     5         ArrayList<String> res = new ArrayList<String>();
     6         int n = words.length;
     7         int i = 0;
     8         while (i < n) {
     9             StringBuilder sb = new StringBuilder();
    10             int last = i + 1;
    11             int len = words[i].length();
    12             while (last < n && len + 1 + words[last].length() <= maxWidth) {
    13                 len += 1 + words[last].length();
    14                 last++;
    15             }
    16             // 最后一行
    17             if (last == n) {
    18                 for (int j = i; j < n; j++) {
    19                     sb.append(words[j] + " ");
    20                 }
    21                 sb.deleteCharAt(sb.length() - 1);
    22                 for (int j = sb.length(); j < maxWidth; j++) {
    23                     sb.append(" ");
    24                 }
    25             } else {
    26                 // 只有一个word
    27                 if (last - i == 1) {
    28                     sb.append(words[i]);
    29                     for (int j = words[i].length(); j < maxWidth; j++)
    30                         sb.append(" ");
    31                 } else {// 有多个单词
    32                     int wordNum = last - i;
    33                     int wordTotal = 0;
    34                     for (int j = i; j < last; j++) {
    35                         wordTotal += words[j].length();
    36                     }
    37                     // eachSpace为每个单词间的空格数;r是余数,表示前r个空格数为eachSpace+1
    38                     int eachSpace = (maxWidth - wordTotal) / (wordNum - 1);
    39                     int r = (maxWidth - wordTotal) % (wordNum - 1);
    40 
    41                     for (int j = i; j < last; j++) {
    42                         sb.append(words[j]);
    43                         if (j < last - 1) {
    44                             for (int k = 0; k < eachSpace + ((j - i) < r ? 1 : 0); k++) {
    45                                 sb.append(" ");
    46                             }
    47                         }
    48                     }
    49                 }
    50             }
    51             res.add(sb.toString());
    52             i = last;
    53         }
    54         return res;
    55     }
    56 }
  • 相关阅读:
    团体程序设计天梯赛-练习集L1-002. 打印沙漏
    团体程序设计天梯赛-练习集L1-001. Hello World
    腾讯的一笔画游戏
    Educational Codeforces Round 11
    POJ 1149 PIGS
    POJ 3422 Kaka's Matrix Travels
    POJ 2914 Minimum Cut
    POJ 1815 Friendship
    POJ 1966 Cable TV Network
    BZOJ 1797: [Ahoi2009]Mincut 最小割
  • 原文地址:https://www.cnblogs.com/kexinxin/p/10163044.html
Copyright © 2020-2023  润新知