Java 题解 | #将单词均匀排列#
将单词均匀排列
https://www.nowcoder.com/practice/47cb397f179a46e1ac0f2e388e1f844a
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param words string字符串一维数组 * @param maxWidth int整型 * @return string字符串一维数组 */ private String repeatChar(char c, int count) { StringBuilder result = new StringBuilder(); for (int i = 0; i < count; i++) { result.append(c); } return result.toString(); } public String[] arrangeWords(String[] words, int maxWidth) { List<String> result = new ArrayList<>(); int i = 0; while (i < words.length) { int j = i; int curWidth = 0; while (j < words.length && (curWidth + words[j].length() + j - i) <= maxWidth) { curWidth += words[j].length(); j++; } int space = maxWidth - curWidth; 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 : (space + j - k - 2) / (j - k - 1); line.append(repeatChar(' ', numSpaces)); space -= (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]); } if (line.length() < maxWidth) { line.append(repeatChar(' ', maxWidth - line.length())); } } result.add(line.toString()); i = j; } return result.toArray(new String[0]); } }
Java编程语言。
该题考察的知识点包括:
- 字符串的基本操作,如拼接、获取长度等。
- 数组或列表的遍历和管理。
- 循环控制,以及条件判断。
- 字符串的填充和对齐操作。
代码解释:
- repeatChar 函数是一个辅助函数,用于生成重复某个字符若干次的字符串。它接受一个字符和重复次数作为参数,返回一个由重复字符组成的字符串。
- 在 arrangeWords 方法中,使用了类似的逻辑,通过遍历 words 数组来排列单词并根据指定的 maxWidth 进行格式化。
- 循环开始,初始化 i 为 0,然后进入一个外层循环,逐行处理。
- 内层循环中,使用 curWidth 来跟踪当前行的宽度,以便确定是否能够容纳更多的单词。
- 在内层循环中,首先计算 numSpaces,即每个单词之间需要的空格数,以保持当前行的总宽度为 maxWidth。
- 通过使用 repeatChar 辅助函数来填充空格,然后将单词添加到当前行的字符串中。
- 如果当前行的单词不足以填满 maxWidth,使用辅助函数 repeatChar 来填充剩余的空格。
- 最终,将当前行添加到 result 列表中,然后更新 i 为 j,以处理下一行。
- 循环结束后,将 result 列表转换为一个字符串数组,并返回作为结果。