大家好,我是开车的阿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空格

京公网安备 11010502036488号