剣はオファーを指します---------語順を逆にします

ここに画像の説明を挿入

トピックリンク!

アイデア:
この質問では、以下の手順に従います。

  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