翻转单词顺序

剑指 offer 58

题目

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

  • 无空格字符构成一个单词。
  • 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
  • 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。

算法

  • 双指针问题。
  • 一个指针从后往前寻找第一个非空格字符,另一个指针从前一个指针指向的非空格字符出发,直到找到一个空格字符为止。
  • 将左指针赋给右指针,继续直到index为零

代码

class Solution {
public:
    string reverseWords(string s) {
        string result;
        int n = s.size();
        if(n == 0) return result;
        int right = n - 1;
        while(right >= 0){
            //从后往前寻找第一字符
            while(right >= 0 && s[right] == ' ') right--;
            if(right < 0) break;

            //从后往前寻找第一个空格
            int left = right;
            while( left >= 0 && s[left] != ' ' ) left--;

            //添加单词到结果
            result += s.substr(left + 1, right - left);
            result += ' ';

            //继续往前分割单词
            right = left;
        }
        //去除最后一个字符空格
        if (!result.empty()) result.pop_back();
        return result;
    }
};
posted @ 2020-12-23 22:58  _一只土拨鼠  阅读(82)  评论(0)    收藏  举报