题解 | #将单词均匀排列#
将单词均匀排列
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; } }