大家好,我是开车的阿Q,又来解决一个有趣的问题啦~

题目考察的知识点

这道题目主要考察字符串处理和排版算法。

题目解答方法的文字分析

我们需要实现一个算法,将一组单词按照规则排列,使得每行的长度都一样,并尽可能均匀地显示。首先,我们可以使用贪心算法来逐个选择单词放入每一行,直到超过 maxWidth 的长度为止。然后,在确定了每行包含的单词后,我们需要计算该行的总空格数,并根据规则分配空格。

具体步骤如下:

  1. 创建一个 vector<string> 结果数组,用于存储最终排版后的文本行。
  2. 逐个遍历单词数组,将单词按照规则放入每一行。在放入之前,我们需要记录当前行已有的单词个数和字符总长度,以便判断是否可以继续放入下一个单词。
  3. 当确定了每一行的单词后,我们需要计算该行的总空格数。然后,根据规则分配空格。空格分配的规则是,将总空格数除以单词个数得到平均空格数,然后将余数依次添加到前面的单词之间。
  4. 对于最后一行,需要特殊处理,将空格全部放到右侧。

本题解析所用的编程语言

我们将使用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空格