0
点赞
收藏
分享

微信扫一扫

文本左右对齐

深夜瞎琢磨 2021-09-21 阅读 87
今日算法
题目描述:
示例 1:
示例 2:
示例 3:
题目分析:
  1. 一行只有一个单词word, 剩余空格数 len = maxWidth - word.length;填充到右边。
  2. 一行有多个单词,假设单词数量为num,则存在num - 1个间隔需要maxWidth - num个单词的长度,需要一次填充到单词的间隔中
  3. 最后一行,单词之间的间隔占据一个空格,剩下的空格全部填充到右边
思路:
代码实现:
class Solution {
    public List<String> result = new ArrayList();
    public String[] arr;
    public int maxWidth;

    public List<String> fullJustify(String[] words, int maxWidth_) {
        maxWidth = maxWidth_;
        arr = words;
        int count = 0;
        int len = words.length;
        int left = 0, right = 0;
        while (right < len) {
            count += words[right].length(); // 计算单词长度.
            count++; // 加上空格
            if ((count - 1)> maxWidth) { // 可以写一行
                count -= words[right].length();
                right--; //上一次单词才是该行最后一个单词
                if (left == right) { // 如果一行只有一个单词
                    oneWord(left);
                } else if (left < right) { // 如果一行有多个单词.
                    manyWord(left, right, count - 2);
                }
                left = right + 1;
                count = 0;
            }
            right++;
        }
        lastWord(left, len - 1, count - 1);
        return result;
    }

    public void oneWord(int left) { // 一个单词一行.
        StringBuilder sb = new StringBuilder();
        sb.append(arr[left]);
        int len = arr[left].length();
        while (len++ < maxWidth) {
            sb.append(" ");
        }
        result.add(sb.toString());
    }

    public void manyWord(int left, int right, int count) {

        int wordNum = right - left + 1; // 单词数量.
        int[] nums = new int[wordNum - 1];
        int len = maxWidth - count + wordNum - 1; // 空格数量.
        int idx = 0;
        while (len-- > 0) {
            nums[idx]++;
            idx++;
            idx %= nums.length;
        }
        idx = 0;
        StringBuilder sb = new StringBuilder();
        while (left <= right) {
            sb.append(arr[left++]);
            if (idx < nums.length) {
                int num = nums[idx++];
                for (int j = 0; j < num; j++) {
                    sb.append(" ");
                }
            }
        }
        result.add(sb.toString());
    }

    public void lastWord(int left, int right, int count) {
StringBuilder sb = new StringBuilder();
        while (left < right) {
            sb.append(arr[left++]).append(" ");

        }
        sb.append(arr[right]);
        while (count++ < maxWidth) {
            sb.append(" ");
        }
        result.add(sb.toString());
    }
}
举报

相关推荐

0 条评论