题解 | #将单词均匀排列#
将单词均匀排列
https://www.nowcoder.com/practice/47cb397f179a46e1ac0f2e388e1f844a
考察的知识点:字符串;
解答方法分析:
- 创建一个空的结果列表 result,并设置索引 i 的初始值为 0。
- 使用 while 循环遍历输入的单词列表,循环条件为 i 的值小于单词列表的长度。
- 在循环中,使用变量 j 初始化为 i,并使用变量 curWidth 来记录当前行已经存在的字符宽度。在内层循环中,通过判断当前行的字符宽度加上下一个单词的字符宽度以及单词之间的空格数量是否小于等于最大宽度,来找到当前行能容纳的单词范围。如果满足条件,则更新 curWidth、递增 j。
- 在找到当前行的单词范围后,用最大宽度减去当前行的字符宽度,得到剩余空格的数量。
- 在内层循环中,从当前行的起始单词到结束单词,逐个添加单词到 line 字符串中。在每个单词之间,根据剩余空格的数量,计算并添加适当的空格数量。如果是最后一行,或者当前行只有一个单词,或者已经遍历至最后一个单词,只需要添加一个空格。
- 如果当前行的字符长度小于最大宽度,说明需要左对齐,并在末尾添加额外的空格,使得字符串长度等于最大宽度。
- 将当前行的字符串 line 添加到结果列表 result 中。
- 将索引 i 更新为内层循环结束时的 j,以便继续处理下一行。
- 在循环结束后,返回结果列表 result。
所用编程语言:C++;
完整编程代码:↓
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param words string字符串vector * @param maxWidth int整型 * @return string字符串vector */ vector<string> arrangeWords(vector<string>& words, int maxWidth) { vector<string> result; int i = 0; while (i < words.size()) { int j = i; int curWidth = 0; while (j < words.size() && (curWidth + words[j].size() + j - i) <= maxWidth){ curWidth += words[j].size(); j++; } int space = maxWidth - curWidth; string line = words[i]; if (j < words.size()) { for (int k = i + 1; k < j; k++) { int numSpaces = 1; if (j - k == 1 || j == words.size()) { numSpaces = 1; } else { numSpaces = (space + j - k - 2) / (j - k - 1); } line += string(numSpaces, ' '); space -= (numSpaces - 1); line += words[k]; } if (line.size() < maxWidth) { line += string(maxWidth - line.size(), ' '); } } else { for (int k = i + 1; k < j; k++) { line += " "; line += words[k]; } if (line.size() < maxWidth) { line += string(maxWidth - line.size(), ' '); } } result.push_back(line); i = j; } return result; } };