大家好,我是开车的阿Q,又来解决一个有趣的问题啦~
题目考察的知识点
这道题目主要考察字符串处理和排版算法。
题目解答方法的文字分析
我们需要实现一个算法,将一组单词按照规则排列,使得每行的长度都一样,并尽可能均匀地显示。首先,我们可以使用贪心算法来逐个选择单词放入每一行,直到超过 maxWidth 的长度为止。然后,在确定了每行包含的单词后,我们需要计算该行的总空格数,并根据规则分配空格。
具体步骤如下:
- 创建一个 vector<string> 结果数组,用于存储最终排版后的文本行。
- 逐个遍历单词数组,将单词按照规则放入每一行。在放入之前,我们需要记录当前行已有的单词个数和字符总长度,以便判断是否可以继续放入下一个单词。
- 当确定了每一行的单词后,我们需要计算该行的总空格数。然后,根据规则分配空格。空格分配的规则是,将总空格数除以单词个数得到平均空格数,然后将余数依次添加到前面的单词之间。
- 对于最后一行,需要特殊处理,将空格全部放到右侧。
本题解析所用的编程语言
我们将使用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 start = i; int totalLength = words[i].length()+1; // 当前行的字符总长度 int wordCount = 1; // 当前行的单词个数 // 确定当前行能放入的单词和字符总长度 while (i + 1 < words.size() &&//第一个默认放的 totalLength + words[i + 1].length() + 1 <= maxWidth) { totalLength += words[i + 1].length() + 1;//考虑中间空格 i++; wordCount++; } // 计算当前行的总空格数 int totalSpaces = maxWidth - totalLength + 1; //不加最后一个空格 // 构建当前行的字符串 string line; if (wordCount == 1 || i == words.size() - 1) { line = words[start]; // 单个单词或者最后一行,左对齐 for (int j = start + 1; j <= i; j++) { line += " " + words[j]; } line += string(maxWidth - line.length(), ' '); // 补齐空格 } else { // 多个单词,平均分配空格 int averageSpaces = totalSpaces / wordCount; int extraSpaces = totalSpaces % wordCount; for (int j = start; j <= i; j++) { if (j < i) line += words[j] + " ";//中间加空格 else line += words[j];//最后一个默认不加 line += string(averageSpaces, ' '); if (extraSpaces > 0) {//左侧多于右侧 line += " "; extraSpaces--; } } } result.push_back(line); i++; } return result; } };
我觉得不是我的问题 eat grass按题目左侧空格多于右侧的要求应该是eat3空格 grass 1空格