剑指 Offer --------- 翻转单词顺序

在这里插入图片描述

题目链接!

思路:
这道题的话我们就按照如下步骤来做:

  1. 倒序遍历字符串 ss ,记录单词左右索引边界 ii , jj ;
  2. 每确定一个单词的边界,则将其添加至单词列表 resres ;
  3. 最终,将单词列表拼接为字符串,并返回即可。

代码:

class Solution {
    
    
public:
    string reverseWords(string s) {
    
    
        string res;
        if(s.size()==0 ) return s;
        int right = s.size()-1;
        int left = 0;
        while(right>=0){
    
    
            while(right>=0 && s[right]==' ') --right;
            if(right<0) break;

            left = right;
            while(left>=0 && s[left]!=' ') --left;
            
            res.append(s.substr(left+1,right-left));
            res.append(" ");

            right = left;
        } 
        if(!res.empty()) res.pop_back();
        return res;
    }
};


//这种做法是我之前一直以为是对的方法,其实是不能AC的
//原因可看后面的图,但是是可以通过修改的,也就是加多一个字符串进行存即可,但是没上面那种方式好
class Solution {
    
    
public:

    void reverse(string::iterator start,string::iterator end){
    
    
        //if(start==NULL || end==NULL) return ;
        if(start!=end){
    
    
            while(start<end){
    
    
                swap(*start,*end);
                ++start;--end;
            }
        }
        return ;
    }

    string reverseWords(string s) {
    
    
        if(s.size()==0 || s.size()==1) return s;
        
        string::iterator p = s.begin();string::iterator q = s.begin();
        int op = 0;
        while( q!=s.end()  ){
    
    
            if((*q) == ' '){
    
    
                ++q;++p;
            }else if( p==s.end() || (*p)==' ' ){
    
    
                auto t1 = q;
                auto t2 = p-1;
                reverse(t1,t2);
                q=(p);
            }else{
    
    
                ++p;
            }
        }
       
        reverse(s.begin(),s.end()-1);
        return s;
    }
};

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43743711/article/details/115261166
今日推荐