题解 | #将单词均匀排列#
将单词均匀排列
https://www.nowcoder.com/practice/47cb397f179a46e1ac0f2e388e1f844a
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param words string字符串一维数组 * @param maxWidth int整型 * @return string字符串一维数组 */ public String[] arrangeWords (String[] words, int maxWidth) { // write code here List<String> result = new ArrayList<>(); int i = 0; while (i < words.length) { int j = i; int curWidth = words[j].length(); j++; while (j < words.length && curWidth + words[j].length() + (j - i) <= maxWidth) { curWidth += words[j].length(); j++; } int totalSpaces = maxWidth - curWidth; int numWords = j - i - 1; StringBuilder line = new StringBuilder(words[i]); if (j < words.length) { for (int k = i + 1; k < j; k++) { int numSpaces = (j - k == 1 || j == words.length) ? 1 : (totalSpaces + j - k - 2) / (j - k - 1); line.append(repeatChar(' ', numSpaces)); totalSpaces -= (numSpaces - 1); line.append(words[k]); } if (line.length() < maxWidth) { line.append(repeatChar(' ', maxWidth - line.length())); } } else { for (int k = i + 1; k < j; k++) { line.append(" "); line.append(words[k]); } line.append(repeatChar(' ', totalSpaces)); } result.add(line.toString()); i = j; } return result.toArray(new String[0]); } private String repeatChar(char c, int count) { StringBuilder result = new StringBuilder(); for (int i = 0; i < count; i++) { result.append(c); } return result.toString(); } }
Java
这道题目考察了贪心算法和字符串处理的能力,
主要是将给定的单词列表按照规定的最大行宽进行排列,并保持每行的单词之间间隔尽可能均匀。
代码的文字解释如下:
- 创建一个空的字符串列表 result 以保存最终的排列结果。定义一个整数变量 i 并初始化为 0,用于追踪当前处理的单词索引。
- 进入主循环,用于遍历单词列表。在循环内部,定义整数变量 j 和 curWidth,其中 j 表示当前行的单词结束索引,curWidth 表示当前行中所有单词的总宽度。
- 在内层循环中,通过计算当前行的宽度,判断是否还能容纳更多的单词。如果可以,将 curWidth 增加下一个单词的长度,并将 j 增加 1。
- 计算当前行剩余的空格数,即 maxWidth 减去 curWidth。计算还未放置的单词数量,即 numWords。
- 创建一个 StringBuilder 对象 line,将当前行的第一个单词添加进去。
- 根据情况,分两种情况处理:a. 如果当前行不是最后一行,即 j < words.length:在一个循环中,从当前行的下一个单词开始遍历到最后一个单词。计算单词之间的平均空格数 avgSpaces,以及额外的空格数 extraSpaces。根据平均空格数和额外空格数,计算每个单词之间的实际空格数,并将其添加到 line 中。如果 line 的长度仍然小于 maxWidth,在行末补充额外的空格。b. 如果当前行是最后一行,即 j == words.length:在一个循环中,将当前行的下一个单词逐个添加到 line 中,每个单词之间用一个空格分隔。在行末补充剩余的空格,使得 line 的长度达到 maxWidth。
- 将当前行的内容 line 添加到结果列表 result 中。
- 将索引 i 更新为 j,以便继续处理下一行。
- 在主循环结束后,将 result 转换为字符串数组并返回。
- 实现了一个辅助方法 repeatChar,用于重复生成一个指定字符多次。