Skip to the content.

Ex58-I 反转单词顺序

题目描述

输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串”I am a student. “,则输出”student. a am I”。

解题思路

以”I am a student”为例,步骤如下:

代码

class Solution {
 public:
  std::string reverseWords(std::string s) {
    // trim space
    int i = 0;
    while (i < s.size() && std::isspace(s[i])) {
      ++i;
    }
    std::string res;
    if (i >= s.size()) return res;
    bool is_last_space = false;
    for (; i < s.size(); ++i) {
      if (std::isspace(s[i]) && !is_last_space) {
        is_last_space = true;
      } else if (std::isspace(s[i]) && is_last_space) {
        continue;
      } else if (!std::isspace(s[i]) && is_last_space) {
        res.push_back(' ');
        res.push_back(s[i]);
        is_last_space = false;
      } else {
        res.push_back(s[i]);
      }
    }
    // reverse
    std::reverse(res.begin(), res.end());
    decltype(s.begin()) start = res.begin();
    for (auto iter = res.begin(); iter != res.end(); ++iter) {
      if (std::isspace(*iter)) {
        std::reverse(start, iter);
        start = iter + 1;
      }
    }
    std::reverse(start, res.end());
    return res;
  }
};

结果

执行结果:通过

执行用时:4 ms, 在所有 C++ 提交中击败了94.57%的用户

内存消耗:7.8 MB, 在所有 C++ 提交中击败了85.39%的用户