大家好,我是开车的阿Q,自动驾驶的时代已经到来,没时间解释了,快和阿Q一起上车。作为自动驾驶系统工程师,必须要有最好的C++基础,让我们来一起刷题吧。

题目考察的知识点

字符串处理,单词逆序。

题目解答方法的文字分析

题目要求我们删除 s 开头和结尾的空格,然后按空格分隔单词,并保持单词内部的顺序不变,只逆序单词的顺序。为了解决这个问题,我们可以采用以下思路:

思路:

  1. 首先,我们需要删除 s 开头和结尾的空格,可以使用 std::string::find_first_not_of()std::string::find_last_not_of() 函数来找到 s 开头和结尾的非空格字符的位置,然后截取出需要处理的子字符串。
  2. 然后,我们可以将子字符串进行逆序处理,得到一个逆序的字符串。
  3. 接下来,遍历逆序字符串,找到每个单词的起始位置和终止位置,遇到空格字符时表示一个单词的终止,将该单词截取出来,然后将单词逆序处理,并加入到结果字符串中,并在单词后面加上一个空格。
  4. 最后,去除结果字符串末尾多余的空格,得到最终的结果。

举个例子:假设 s = " 牛X牛 Y 牛Z ".

  1. 删除开头和结尾的空格得到 "牛X牛 Y 牛Z".
  2. "牛X牛 Y 牛Z" 逆序得到逆序字符串 "Z牛 Y 牛X牛".
  3. 遍历逆序字符串,找到 "Z牛 ",将 "Z牛" 逆序得到 "牛Z",加入结果字符串。
  4. 继续遍历,找到 "Y ",将 "Y" 逆序得到 "Y",加入结果字符串。
  5. 最后找到 "牛X牛",将 "牛X牛" 逆序得到 "牛X牛",加入结果字符串。
  6. 去除结果字符串末尾多余的空格,得到最终的结果 "牛Z Y 牛X牛"。

本题解析所用的编程语言

C++

完整且正确的编程代码

class Solution {
public:
    string reverseWords(string s) {
        // 删除开头和结尾的空格
        int start = s.find_first_not_of(' ');
        int end = s.find_last_not_of(' ');
        s = s.substr(start, end - start + 1);
        
        // 逆序处理整个字符串
        reverse(s.begin(), s.end());
        
        string result = ""; // 用于存储结果的字符串
        int wordStart = 0;
        int wordEnd = 0;
        
        // 遍历逆序字符串,寻找每个单词的起始位置和终止位置
        while (wordEnd < s.size()) {
            if (s[wordEnd] == ' ') {
                // 截取一个单词并逆序加入结果字符串
                result += reverseWord(s.substr(wordStart, wordEnd - wordStart)) + " ";
                // 跳过空格字符
                while (wordEnd < s.size() && s[wordEnd] == ' ') {
                    wordEnd++;
                }
                // 更新下一个单词的起始位置
                wordStart = wordEnd;
            } else {
                wordEnd++;
            }
        }
        
        // 处理最后一个单词
        result += reverseWord(s.substr(wordStart, wordEnd - wordStart));
        
        return result;
    }
    
    // 辅助函数:逆序单词
    string reverseWord(string word) {
        reverse(word.begin(), word.end());
        return word;
    }
};

您的关注、点赞、收藏就是我创作的动力,三连支持阿Q!