微软面试题: LeetCode 151. 翻转字符串里的单词 出现次数:2

题目描述:

 

 思路:

      1.  先把整个字符串翻转;

    2. 然后再将字符串中的每个单词往前移同时对每个单词再做翻转,每个单词之间留出一个空格。

       3. 在步骤 2 完成之后,原字符串中多余的空格会全部在字符串尾部,再将字符串尾部多余的空格

           全部删除即可;

代码:

  

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 class Solution {
 4 public:
 5     string reverseWords(string s)
 6     {
 7         std::reverse(s.begin(),s.end());
 8         const int s_len = s.size();
 9         int idx = 0;
10         for(int i = 0 ; i < s_len; ++i)
11         {
12             if(s[i] != ' ')
13             {
14                 if(idx != 0)    s[idx++] = ' ';//除了第一个单词之外,所有单词前都需要放空格
15                 int j = i;
16                 int w_begin = idx;//每个单词起始字符的下标
17                 while(j < s_len && s[j] != ' ')//将整个单词往前移
18                 {
19                     s[idx++] = s[j++];
20                 }
21                 std::reverse(s.begin() + w_begin,s.begin() + idx);//将单词翻转
22                 i = j;//处理后面的单词
23             }
24         }
25         s.erase(s.begin() + idx,s.end());//移动翻转完成后,去掉字符串尾部的空格
26         return s;
27     }
28 };

 

posted @ 2021-04-06 17:13  谁在写西加加  阅读(56)  评论(0编辑  收藏  举报