题解 | #将单词均匀排列#
将单词均匀排列
https://www.nowcoder.com/practice/47cb397f179a46e1ac0f2e388e1f844a
import java.util.*;
import java.util.stream.Collectors;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param words string字符串一维数组
* @param maxWidth int整型
* @return string字符串一维数组
*/
public String[] arrangeWords (String[] words, int maxWidth) {
// write code here
List<String> res = new ArrayList<>();
// 当前行数
int curRows = 0;
for (int i = 0; i < words.length;) {
int curWords = 0;
int curLength = 0;
int index;
StringBuilder sb = new StringBuilder();
// 根据最大字符数maxWidth判断当前行具备多少个单词字符串
// curLength:当前单词字符串加一个空格的长度
// curWords:当前单词字符串的个数
while (i + curWords < words.length) {
curLength += words[i + curWords].length() + 1;
curWords++;
if (curLength > maxWidth + 1) {
curWords--;
curLength = curLength - words[i + curWords].length() - 1;
break;
}
}
// 单词数组当前行涵盖最后一个单词所在的索引位置
index = i + curWords - 1;
// 当前行除字符外空格长度
int spaceLength = maxWidth - curLength + curWords;
// 最后一行处理
if (i + curWords == words.length) {
for (int j = i; j < i + curWords; j++) {
if (j != i + curWords - 1) {
sb.append(words[j] + " ");
} else {
sb.append(words[j]);
}
}
int remainder = maxWidth - sb.length();
for (int k = 0; k < remainder; k++) {
sb.append(" ");
}
} else {
for (int j = i; j < i + curWords; j++) {
sb.append(words[j]);
int avgSpaceLength = 0;
// 只有单个单词行处理
if (curWords == 1) {
avgSpaceLength = spaceLength;
// 添加空格
for (int m = 0; m < avgSpaceLength; m++) {
sb.append(" ");
}
} else {
avgSpaceLength = (int)(Math.ceil(spaceLength * 1.0 / (curWords - 1)));
if (j != i + curWords - 1) {
// 如果某一行的空格不能均匀分配,那么使行左侧的空格数多于右侧的空格数。
int last = spaceLength - avgSpaceLength * (curWords - 2);
if (j == i + curWords - 2 && last < avgSpaceLength) {
avgSpaceLength = last;
}
// 添加空格
for (int m = 0; m < avgSpaceLength; m++) {
sb.append(" ");
}
}
}
}
}
i = index + 1;
res.add(sb.toString());
}
String[] result = new String[res.size()];
for (int i = 0; i < res.size(); i++) {
result[i] = res.get(i);
}
return result;
}
}