68.文字左右对齐

68. 文本左右对齐

class Solution {
public static List<String> fullJustify(String[] words, int maxWidth) {
        List<String> result = new ArrayList<>();
        int width = 0;
        StringBuilder sb = new StringBuilder();
        for(String word : words) {
            if ((width + word.length()) <= maxWidth) {
                sb.append(word).append(" ");
                width += word.length() + 1;
            } else {
                result.add(matchSpace(sb.toString(), maxWidth));
                sb = new StringBuilder(word).append(" ");
                width = word.length() + 1;
            }
        }
        result.add(String.format("%-" + maxWidth + "s", sb.toString().trim()));
        return result;
    }

    private static String matchSpace(String word, int maxWidth) {
        String[] words = word.split(" ");
        if (words.length == 1) {
            return String.format("%-" + maxWidth + "s", words[0]);
        }
        int gap = words.length - 1;
        int spaceLength = maxWidth - word.replaceAll(" ", "").length() - gap;
        StringBuilder sb = new StringBuilder();
        for (String w : words) {
            sb.append(w).append(" ");
            if (gap > 0) {
                int needAdd = spaceLength % gap == 0 ? spaceLength / gap : spaceLength /gap + 1;
                if (needAdd > 0) {
                    sb.append(String.format("%-" + needAdd + "s", ""));
                    gap--;
                    spaceLength -= needAdd;
                }
            }
        }
        return sb.substring(0,maxWidth);
    }
}

解题思路

  • 题目难度为困难,但看着更像是业务处理,我觉得没有啥特殊的解题手段;

  • 难点在于空格的均匀分配
    1、首先字母与字母之间有一个空格;
    2、要求均匀分配,不可均匀分配时左多右少;
    3、分配规则:1)需要分配的空格数 L,需要分配的位置 N,可整除时均匀分配即可;2)不可整除时,L / N 的结果加1作为第一个位置的空格数;3)L = L - (L/N+1), N = N-1,重复步骤1,循环到结束;
    4、单独处理最后一行;

  • 这几天的题目让我有一种错觉,我 TM 又行了🤣

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容