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 又行了🤣